[FFmpeg-devel] [PATCH] mxfdec: add timecode to metadata

Matthieu Bouron matthieu.bouron at gmail.com
Fri Mar 9 18:33:30 CET 2012


2012/2/23 Matthieu Bouron <matthieu.bouron at gmail.com>:
> 2012/2/23 Clément Bœsch <ubitux at gmail.com>:
>> On Thu, Feb 23, 2012 at 06:00:11PM +0100, Matthieu Bouron wrote:
>> [...]
>>> +static int mxf_read_timecode_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
>>> +{
>>> +    MXFTimecodeComponent *mxf_timecode = arg;
>>> +    switch(tag) {
>>> +    case 0x1501:
>>> +        mxf_timecode->start_frame = avio_rb64(pb);
>>> +        break;
>>> +    case 0x1502:
>>> +        mxf_timecode->rate = (AVRational){avio_rb16(pb), 1};
>>> +        break;
>>> +    case 0x1503:
>>> +        mxf_timecode->drop_frame = avio_r8(pb);
>>> +        break;
>>> +    }
>>> +    return 0;
>>> +}
>>> +
>>>  static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
>>>  {
>>>      MXFTrack *track = arg;
>>> @@ -1233,6 +1260,14 @@ finish_decoding_index:
>>>      return ret;
>>>  }
>>>
>>> +static int mxf_add_timecode_metadata(AVDictionary **pm, const char *key, AVTimecode *tc)
>>> +{
>>> +    char buf[16];
>>
>> AV_TIMECODE_STR_SIZE instead of 16
>>
>>> +    av_dict_set(pm, key, av_timecode_make_string(tc, buf, 0), 0);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>>  static int mxf_parse_structural_metadata(MXFContext *mxf)
>>>  {
>>>      MXFPackage *material_package = NULL;
>>> @@ -1257,24 +1292,44 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
>>>          MXFTrack *temp_track = NULL;
>>>          MXFDescriptor *descriptor = NULL;
>>>          MXFStructuralComponent *component = NULL;
>>> +        MXFTimecodeComponent *mxf_tc = NULL;
>>>          UID *essence_container_ul = NULL;
>>>          const MXFCodecUL *codec_ul = NULL;
>>>          const MXFCodecUL *container_ul = NULL;
>>>          AVStream *st;
>>> +        AVTimecode tc;
>>>
>>>          if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
>>>              av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
>>>              continue;
>>>          }
>>>
>>> +        if ((component = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, TimecodeComponent))) {
>>> +            mxf_tc = (MXFTimecodeComponent*)component;
>>> +            if (av_timecode_init(&tc, mxf_tc->rate, mxf_tc->drop_frame == 1, mxf_tc->start_frame, mxf) == 0) {
>>
>> Better use a variable like flags = mxf_tc->drop_frame == 1 ?
>> AV_TIMECODE_FLAG_DROPFRAME : 0, instead of assuming the value of the flag.
>>
>>> +                mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
>>> +            }
>>> +        }
>>> +
>>>          if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
>>>              av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
>>>              continue;
>>>          }
>>>
>>> +        for (j = 0; j < material_track->sequence->structural_components_count; j++) {
>>> +            component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], TimecodeComponent);
>>> +            if (!component)
>>> +                continue;
>>> +
>>> +            mxf_tc = (MXFTimecodeComponent*)component;
>>> +            if (av_timecode_init(&tc, mxf_tc->rate, mxf_tc->drop_frame == 1, mxf_tc->start_frame, mxf) == 0) {
>>
>> Same as above
>>
>>> +                mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
>>
>> It looks like you are replacing the timecode metadata, I guess it's
>> desired?
>
> Structural information should only contain zero or one timecode track,
> so i guess it's not a problem.
>
>>
>> BTW, what about the SMPTE timecode in the "system item"?
>
> I think It could be part of an another patch.
>
>>
>> Also, you might want to update doc/general.texi if the feature is
>> complete.
>
> New patch attached.
> Thanks

Ping.
Rebased patch attached.

>>
>> [...]
>>
>> --
>> Clément B.
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mxfdec-add-timecode-to-metadata.patch
Type: text/x-diff
Size: 6462 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120309/bf2bc9e0/attachment.bin>


More information about the ffmpeg-devel mailing list