On Thu, Oct 10, 2013 at 11:37 PM, John Stebbins <[email protected]> wrote:
> On 10/10/2013 01:48 PM, Vittorio Giovara wrote:
>> On Thursday, October 10, 2013, John Stebbins wrote:
>>
>>> This can be optionally disabled whith the "showall" flags2 option.
>>> When in "showall" mode, incomplete frames are signalled through
>>> AVFrame.flags FRAME_FLAG_INCOMPLETE_FRAME.
>>> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
>>> index 81e3d2b..48b3cae 100644
>>> --- a/libavcodec/mpegvideo.h
>>> +++ b/libavcodec/mpegvideo.h
>>> @@ -172,6 +172,7 @@ typedef struct Picture{
>>>
>>>      int reference;
>>>      int shared;
>>> +    int recovered;              ///< Picture at IDR or recovery point +
>>> recovery count
>>>  } Picture;
>>
>> I'm not sure I understand why this is needed here, AVFrame seems enough to
>> store recovery information no?
>
> AVFrame is a public struct.  Applications don't need to see this internal 
> state tracking data.

Yes, umh so if this info is already in avframe why does it need to be
in mpegvideo?

>
>>
>>
>>>  /**
>>> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
>>> index 5e9d484..9113272 100644
>>> --- a/libavcodec/options_table.h
>>> +++ b/libavcodec/options_table.h
>>> @@ -72,6 +72,7 @@ static const AVOption avcodec_options[] = {
>>>  {"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.i64 =
>>> CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, "flags2"},
>>>  {"ignorecrop", "ignore cropping information from sps", 1,
>>> AV_OPT_TYPE_CONST, {.i64 = CODEC_FLAG2_IGNORE_CROP }, INT_MIN, INT_MAX,
>>> V|D, "flags2"},
>>>  {"local_header", "place global headers at every keyframe instead of in
>>> extradata", 0, AV_OPT_TYPE_CONST, {.i64 = CODEC_FLAG2_LOCAL_HEADER },
>>> INT_MIN, INT_MAX, V|E, "flags2"},
>>> +{"showall", "Show all frames before the first keyframe", 0,
>>> AV_OPT_TYPE_CONST, {.i64 = CODEC_FLAG2_SHOW_ALL }, INT_MIN, INT_MAX, V|D,
>>> "flags2"},
>>>  {"me_method", "set motion estimation method", OFFSET(me_method),
>>> AV_OPT_TYPE_INT, {.i64 = ME_EPZS }, INT_MIN, INT_MAX, V|E, "me_method"},
>>>  {"zero", "zero motion estimation (fastest)", 0, AV_OPT_TYPE_CONST, {.i64
>>> = ME_ZERO }, INT_MIN, INT_MAX, V|E, "me_method" },
>>>  {"full", "full motion estimation (slowest)", 0, AV_OPT_TYPE_CONST, {.i64
>>> = ME_FULL }, INT_MIN, INT_MAX, V|E, "me_method" },
>>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>>> index 098bbed..78bad66 100644
>>> --- a/libavutil/frame.c
>>> +++ b/libavutil/frame.c
>>> @@ -379,6 +379,7 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame
>>> *src)
>>>      dst->quality             = src->quality;
>>>      dst->coded_picture_number = src->coded_picture_number;
>>>      dst->display_picture_number = src->display_picture_number;
>>> +    dst->flags               = src->flags;
>>>
>>>      memcpy(dst->error, src->error, sizeof(dst->error));
>>>
>>> diff --git a/libavutil/frame.h b/libavutil/frame.h
>>> index b0676e7..19fdc1b 100644
>>> --- a/libavutil/frame.h
>>> +++ b/libavutil/frame.h
>>> @@ -350,6 +350,9 @@ typedef struct AVFrame {
>>>
>>>      AVFrameSideData **side_data;
>>>      int            nb_side_data;
>>> +
>>> +    int flags;
>>> +#define FRAME_FLAG_INCOMPLETE_FRAME 0x0001
>>>  } AVFrame;
>>
>> I adding the flag here breaks ABI; this kind on data should go in side_data
>> in my opinion. Also you always set this flag but never read it, is this the
>> intended behavior?
> This is information that may be useful to an application.  It is not needed 
> by libav.  It can be eliminated if you all
> feel strongly that you don't want it.  But I think an application that 
> chooses to enable the "showall" feature may also
> be interested in which frames are actually complete and which are not.

That's a nice purpose and should be available, as long as it doesn't
break ABI though.

> I haven't looked into the design of side_data,
> so I don't know if it is appropriate to put this flag there.  If someone who 
> understands the side_data design thinks
> this is an architecturally sound thing to do, I would gladly move it there.

It's quite easy, take a look at https://patches.libav.org/patch/42767/
All you need is define a new element in AVFrameSideData
(libavutil/frame.h) and then access it like in the patch above.

Cheers,
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to