[FFmpeg-devel] [PATCH] avformat/fivdec: cached keyframes before video or audio stream was created

XinZheng Zhang zhangxzheng at gmail.com
Tue Jul 26 20:31:29 EEST 2016


On Wed, Jul 27, 2016 at 1:12 AM, Michael Niedermayer
<michael at niedermayer.cc> wrote:
> On Tue, Jul 26, 2016 at 08:17:46PM +0800, Xinzheng Zhang wrote:
>> ---
>>  libavformat/flvdec.c | 84 ++++++++++++++++++++++++++++++++++++++++++----------
>>  1 file changed, 69 insertions(+), 15 deletions(-)
>>
>> diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
>> index 2bf1e05..82b9f83 100644
>> --- a/libavformat/flvdec.c
>> +++ b/libavformat/flvdec.c
>> @@ -61,6 +61,12 @@ typedef struct FLVContext {
>>
>>      int broken_sizes;
>>      int sum_flv_tag_size;
>> +
>> +    int vhead_exists;
>> +    int ahead_exists;
>> +    int keyframe_count;
>> +    int64_t *keyframe_times;
>> +    int64_t *keyframe_filepositions;
>>  } FLVContext;
>>
>>  static int probe(AVProbeData *p, int live)
>> @@ -92,6 +98,42 @@ static int live_flv_probe(AVProbeData *p)
>>      return probe(p, 1);
>>  }
>>
>> +static void add_keyframes_index(AVFormatContext *s)
>> +{
>> +    FLVContext *flv           = s->priv_data;
>> +    AVStream *current_stream  = NULL;
>> +    AVStream *vstream         = NULL;
>> +    AVStream *astream         = NULL;
>> +    unsigned int i,j                ;
>> +
>> +    for (i = 0; i< s->nb_streams; i++) {
>> +        if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
>> +            vstream = s->streams[i];
>> +        } else if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
>> +            astream = s->streams[i];
>> +        }
>> +    }
>
> this shouldt be needed
> just keep track of the stram index that the table belongs to
> that is add a flv->keyframe_stream_index
>
>
ok

>> +
>> +    AVStream *streams[2] = {vstream, astream};
>> +    for (i = 0; i < 2; i++) {
>> +        current_stream = streams[i];
>> +        if (current_stream && current_stream->nb_index_entries==0) {
>> +            for (j = 0; j < flv->keyframe_count; j++) {
>> +                av_add_index_entry(current_stream, flv->keyframe_filepositions[j], flv->keyframe_times[j] * 1000,
>> +                                   0, 0, AVINDEX_KEYFRAME);
>> +            }
>> +        }
>> +    }
>> +
>> +    // free keyframe index only if all expected streams have been created
>> +    if (((vstream && vstream->nb_index_entries>0) || !flv->vhead_exists) &&
>> +        ((astream && astream->nb_index_entries>0) || !flv->ahead_exists)) {
>> +        av_freep(&flv->keyframe_times);
>> +        av_freep(&flv->keyframe_filepositions);
>> +        flv->keyframe_count = 0;
>> +    }
>> +}
>
> spliting add_keyframes_index() out must be in a seperate patch
>
> also i would not trust the *head_exists flags, IIRC they can be
> wrong and they are not needed
> the function should just take the table load it with
> av_add_index_entry() and free the table.
> The rest should not be needed
> should be much simpler unless iam missing something
>
>

If I don't trust the head_exists flags, when should I free the index table?
Should I keep the index util both a\v stream have been loaded or keep
it util the flv_read_close().

> [...]
>> @@ -305,8 +348,7 @@ static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize)
>>      return length;
>>  }
>>
>> -static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc,
>> -                                 AVStream *vstream, int64_t max_pos)
>> +static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t max_pos)
>>  {
>>      FLVContext *flv       = s->priv_data;
>>      unsigned int timeslen = 0, fileposlen = 0, i;
>> @@ -316,7 +358,7 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc,
>>      int ret                = AVERROR(ENOSYS);
>>      int64_t initial_pos    = avio_tell(ioc);
>>
>> -    if (vstream->nb_index_entries>0) {
>> +    if (flv->keyframe_count > 0) {
>>          av_log(s, AV_LOG_WARNING, "Skipping duplicate index\n");
>>          return 0;
>>      }
>
> this looks wrong, a file can contain an index for each stream
> that shouldnt trigger a warning, only if there are 2 for the same
> stream its a duplicate
>
>
ok

> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> What does censorship reveal? It reveals fear. -- Julian Assange
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list