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

Michael Niedermayer michael at niedermayer.cc
Tue Jul 26 20:12:29 EEST 2016


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


> +
> +    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


[...]
> @@ -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


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

What does censorship reveal? It reveals fear. -- Julian Assange
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160726/ba7a5f78/attachment.sig>


More information about the ffmpeg-devel mailing list