[Libav-user] libavcodec usage inside Cinelerra-GG [LONG]

Andrew Randrianasulu randrianasulu at gmail.com
Mon Nov 4 17:18:44 EET 2019


В сообщении от Sunday 03 November 2019 13:56:09 Carl Eugen Hoyos написал(а):
> Am So., 3. Nov. 2019 um 11:53 Uhr schrieb Andrew Randrianasulu
> <randrianasulu at gmail.com>:
> 
> > For what exactly I should look?
> 
> You claim that AVStream->time_base is changing (which sounds strange to me
> but who know) on seeking, you could look (with printf's) how ffmpeg.c
> deals with this.
> I cannot know...

Update, just compiled CinelerraGG with ffmpeg.git

LANG=ru_RU.utf8 /dev/shm/tmp/cinelerra-goodguy-20191104/cinelerra-5.1/bin/cin
Cinelerra Infinity - built: Nov  4 2019 16:35:57
git://git.cinelerra-gg.org/goodguy/cinelerra.git
(c) 2006-2019 Heroine Virtual Ltd. by Adam Williams
(c) 2007-2019 cin5 derivative by W.P. Morrow aka goodguy
Cinelerra is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions. There is absolutely no warranty for Cinelerra.

FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
Device type none is not supported.
Available device types: vdpau cuda vaapi opencl
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
Device type none is not supported.
Available device types: vdpau cuda vaapi opencl
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
Device type none is not supported.
Available device types: vdpau cuda vaapi opencl
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,25
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
FFMPEG::open_decoder: some stream times estimated: /home/guest/botva/Downloads/from_Vladimir/Leningrad dolphinarium 16 09 2009/LD_160909_2.avi
Timebase from stream: 1,25
Timebase from stream: 1,25
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Timebase from stream: 1,30000
Session time: 0:00:19
Cpu time: user: 0:00:04.433 sys: 0:00:01.064

1,25 print was before I tried to seek in stream, but it jumped to 1,30000 after I tried to set playback cursor
to some 3 min into video.

Cinelerra git:
commit 83cdf330ba14342487a08d72e25ef29736d41100 (grafted, HEAD -> master, origin/master, origin/HEAD)
Author: Good Guy <good1.2guy at gmail.com>
Date:   Sat Nov 2 19:32:42 2019 -0600

    correct last chkin dvd opts files

ffmpeg.git:
commit ec3d3fc65d06a9f7bc4d32b12b14a7c75e00484d (HEAD -> master, origin/master, origin/HEAD)
Author: Jun Zhao <barryjzhao at tencent.com>
Date:   Sat Jun 15 16:21:56 2019 +0800

    lavf/asfdec: Simplify the check conditions

    Simplify the check conditions

    Signed-off-by: Jun Zhao <barryjzhao at tencent.com>


my diff for ffmpeg.c:

diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C
index 70098ca..3cf85a9 100644
--- a/cinelerra-5.1/cinelerra/ffmpeg.C
+++ b/cinelerra-5.1/cinelerra/ffmpeg.C
@@ -681,7 +681,11 @@ int FFStream::seek(int64_t no, double rate)
        }
        if( pos == curr_pos ) return 0;
        double secs = pos < 0 ? 0. : pos / rate;
-       AVRational time_base = st->time_base;
+// if user forced timebase to a specified stream
+       AVRational time_base = ffmpeg->force_timebase >= 0 ?
+               ffmpeg->fmt_ctx->streams[ffmpeg->force_timebase]->time_base :
+               st->time_base;
+               fprintf(stderr, "Timebase from stream: %i,%i \n", time_base.num, time_base.den);
        int64_t tstmp = time_base.num > 0 ? secs * time_base.den/time_base.num : 0;
        if( !tstmp ) {
                if( st->nb_index_entries > 0 ) tstmp = st->index_entries[0].timestamp;
@@ -1192,10 +1196,19 @@ int FFVideoStream::video_seek(int64_t pos)
        if( pos == curr_pos-1 && !seeked ) return 0;
 // if close enough, just read up to current
        int gop = avctx->gop_size;
-       if( gop < 4 ) gop = 4;
+       if( gop < 4 && gop != 0) gop = 4;
        if( gop > 64 ) gop = 64;
+       if( gop == 0 ) gop = 1;
+       //fprintf(stderr, "GOP: %i \n", gop);
        int read_limit = curr_pos + 3*gop;
        if( pos >= curr_pos && pos <= read_limit ) return 0;
+       // fixup for I-only codecs, not sure why it needed with ffmpeg 4.2
+       if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO || st->codecpar->codec_id == AV_CODEC_ID_MJPEG ||
+       st->codecpar->codec_id == AV_CODEC_ID_FFVHUFF || st->codecpar->codec_id == AV_CODEC_ID_DNXHD ||
+       st->codecpar->codec_id ==AV_CODEC_ID_HUFFYUV ) {
+       gop = 1;
+       if( seek(pos - 2*gop, frame_rate) < 0 ) return -1;
+       }
 // guarentee preload more than 2*gop frames
        if( seek(pos - 3*gop, frame_rate) < 0 ) return -1;
        return 1;
@@ -1576,6 +1589,7 @@ FFMPEG::FFMPEG(FileBase *file_base)
        flow = 1;
        decoding = encoding = 0;
        has_audio = has_video = 0;
+       force_timebase = -1;
        opts = 0;
        opt_duration = -1;
        opt_video_filter = 0;
@@ -2271,6 +2285,8 @@ int FFMPEG::init_decoder(const char *filename)
                if( (tag=av_dict_get(opts, "format", NULL, 0)) != 0 ) {
                        ifmt = av_find_input_format(tag->value);
                }
+               if( (tag=av_dict_get(opts, "force_timebase", NULL, 0)) != 0 )
+                       force_timebase = atoi(tag->value);
        }
        else
                load_options("decode.opts", opts);

actually patch was mostly developed by CinelerraGG developer, I only added

 fprintf(stderr, "Timebase from stream: %i,%i \n", time_base.num, time_base.den);

(for testing I moved opts file I used to fix this stream away:

mv /home/guest/botva/Downloads/from_Vladimir/Leningrad\ dolphinarium\ 16\ 09\ 2009/LD_160909_2.opts \
/home/guest/botva/Downloads/from_Vladimir/Leningrad\ dolphinarium\ 16\ 09\ 2009/LD_160909_2___.opts )

Is this enough for demonstrating problem ?

> 
> Carl Eugen
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
> 
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".




More information about the Libav-user mailing list