[FFmpeg-devel] [PATCH] lavc: add a pkt_pos field to AVFrame

Stefano Sabatini stefano.sabatini-lala at poste.it
Fri Apr 29 12:33:26 CEST 2011


On date Friday 2011-04-29 12:31:35 +0200, Stefano Sabatini encoded:
> This is similar to what was done with pkt_pts. This simplifies the
> operation of extracting the pos information from the AVPacket, and
> allows further simplifications.
> ---
>  cmdutils.c               |    1 +
>  ffplay.c                 |    2 +-
>  libavcodec/avcodec.h     |    7 +++++++
>  libavcodec/rawdec.c      |    1 +
>  libavcodec/utils.c       |   10 ++++++++--
>  libavfilter/vsrc_movie.c |    3 +--
>  6 files changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/cmdutils.c b/cmdutils.c
> index 5ad45e1..f885a7c 100644
> --- a/cmdutils.c
> +++ b/cmdutils.c
> @@ -897,6 +897,7 @@ int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
>  
>      memcpy(frame->data,     picref->data,     sizeof(frame->data));
>      memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
> +    frame->pkt_pos          = picref->pos;
>      frame->interlaced_frame = picref->video->interlaced;
>      frame->top_field_first  = picref->video->top_field_first;
>      frame->key_frame        = picref->video->key_frame;
> diff --git a/ffplay.c b/ffplay.c
> index 3cd3c3f..35500d0 100644
> --- a/ffplay.c
> +++ b/ffplay.c
> @@ -1687,7 +1687,7 @@ static int input_request_frame(AVFilterLink *link)
>      av_free_packet(&pkt);
>  
>      picref->pts = pts;
> -    picref->pos = pkt.pos;
> +    picref->pos = priv->frame->pkt_pos;
>      picref->video->pixel_aspect = priv->is->video_st->codec->sample_aspect_ratio;
>      avfilter_start_frame(link, picref);
>      avfilter_draw_slice(link, 0, link->h, 1);
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index b69230f..251a038 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -1004,6 +1004,13 @@ typedef struct AVPanScan{
>       * - decoding: set by libavcodec, read by user.\
>       */\
>      int64_t best_effort_timestamp;\
> +\
> +    /**\
> +     * reordered pos from the last AVPacket that has been input into the decoder\
> +     * - encoding: unused\
> +     * - decoding: Read by user.\
> +     */\
> +    int64_t pkt_pos;\
>  
>  
>  #define FF_QSCALE_TYPE_MPEG1 0
> diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c
> index d9993c0..029bee2 100644
> --- a/libavcodec/rawdec.c
> +++ b/libavcodec/rawdec.c
> @@ -124,6 +124,7 @@ static int raw_decode(AVCodecContext *avctx,
>      frame->top_field_first = avctx->coded_frame->top_field_first;
>      frame->reordered_opaque = avctx->reordered_opaque;
>      frame->pkt_pts          = avctx->pkt->pts;
> +    frame->pkt_pos          = avctx->pkt->pos;
>  
>      //2bpp and 4bpp raw in avi and mov (yes this is ugly ...)
>      if (context->buffer) {
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 45bf73f..ec22d8e 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -341,8 +341,13 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
>      }
>      s->internal_buffer_count++;
>  
> -    if(s->pkt) pic->pkt_pts= s->pkt->pts;
> -    else       pic->pkt_pts= AV_NOPTS_VALUE;
> +    if (s->pkt) {
> +        pic->pkt_pts = s->pkt->pts;
> +        pic->pkt_pos = s->pkt->pos;
> +    } else {
> +        pic->pkt_pts = AV_NOPTS_VALUE;
> +        pic->pkt_pos = -1;
> +    }

While at it we could maybe add an AV_NOPOS_VALUE macro.
-- 
FFmpeg = Fantastic Fundamental MultiPurpose Erudite Guide


More information about the ffmpeg-devel mailing list