On 03/07/14 22:13, Martin Storsjö wrote:
> On Wed, 2 Jul 2014, Luca Barbato wrote:
>
>> ---
>> libavformat/movenc.c | 57
>> +++++++++++++++++++++++++++++++++++++++++++---------
>> 1 file changed, 47 insertions(+), 10 deletions(-)
>
> For the subject, please reorder the sentence, "Make format-specific
> details settable"
>
>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>> index f5c36fc..713949a 100644
>> --- a/libavformat/movenc.c
>> +++ b/libavformat/movenc.c
>> @@ -1314,11 +1314,16 @@ static int mov_write_hdlr_tag(AVIOContext *pb,
>> MOVTrack *track)
>> const char *hdlr, *descr = NULL, *hdlr_type = NULL;
>> int64_t pos = avio_tell(pb);
>>
>> + uint32_t flags = 0, mask = 0;
>> +
>> hdlr = "dhlr";
>> hdlr_type = "url ";
>> descr = "DataHandler";
>>
>> if (track) {
>> + AVStream *st = track->st;
>> + AVDictionaryEntry *tag;
>> +
>> hdlr = (track->mode == MODE_MOV) ? "mhlr" : "\0\0\0\0";
>> if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) {
>> hdlr_type = "vide";
>> @@ -1352,6 +1357,13 @@ static int mov_write_hdlr_tag(AVIOContext *pb,
>> MOVTrack *track)
>> "Unknown hldr_type for %s / 0x%04X, writing dummy
>> values\n",
>> tag_buf, track->enc->codec_tag);
>> }
>> + tag = av_dict_get(st->metadata, "mov-component-flags", NULL, 0);
>> + if (tag)
>> + flags = atoi(tag->value);
>> +
>> + tag = av_dict_get(st->metadata, "mov-component-mask", NULL, 0);
>> + if (tag)
>> + mask = atoi(tag->value);
>> }
>>
>> avio_wb32(pb, 0); /* size */
>> @@ -1360,8 +1372,8 @@ static int mov_write_hdlr_tag(AVIOContext *pb,
>> MOVTrack *track)
>> avio_write(pb, hdlr, 4); /* handler */
>> ffio_wfourcc(pb, hdlr_type); /* handler type */
>> avio_wb32(pb, 0); /* reserved */
>> - avio_wb32(pb, 0); /* reserved */
>> - avio_wb32(pb, 0); /* reserved */
>> + avio_wb32(pb, flags);
>> + avio_wb32(pb, mask);
>> if (!track || track->mode == MODE_MOV)
>> avio_w8(pb, strlen(descr)); /* pascal string */
>> avio_write(pb, descr, strlen(descr)); /* handler description */
>> @@ -1464,6 +1476,12 @@ static int mov_write_tkhd_tag(AVIOContext *pb,
>> MOVTrack *track, AVStream *st)
>> int64_t duration = av_rescale_rnd(track->track_duration,
>> MOV_TIMESCALE,
>> track->timescale, AV_ROUND_UP);
>> int version = duration < INT32_MAX ? 0 : 1;
>> + int flags = (track->flags & MOV_TRACK_ENABLED) ?
>> + MOV_TKHD_FLAG_ENABLED | MOV_TKHD_FLAG_IN_MOVIE :
>> + MOV_TKHD_FLAG_IN_MOVIE;
>
> This could do with some extra deobfuscation (separately after this
> patch), into something like this, which would be way more readable to me:
>
> int flags = MOV_TKHD_FLAG_IN_MOVIE;
> if (track->flags & MOV_TRACK_ENABLED)
> flags |= MOV_TKHD_FLAG_ENABLED;
>
>
>> + int group = st ? st->codec->codec_type : 0;
>> +
>> + AVDictionaryEntry *tag;
>>
>> if (track->mode == MODE_ISM)
>> version = 1;
>> @@ -1471,9 +1489,13 @@ static int mov_write_tkhd_tag(AVIOContext *pb,
>> MOVTrack *track, AVStream *st)
>> (version == 1) ? avio_wb32(pb, 104) : avio_wb32(pb, 92); /* size */
>> ffio_wfourcc(pb, "tkhd");
>> avio_w8(pb, version);
>> - avio_wb24(pb, (track->flags & MOV_TRACK_ENABLED) ?
>> - MOV_TKHD_FLAG_ENABLED | MOV_TKHD_FLAG_IN_MOVIE :
>> - MOV_TKHD_FLAG_IN_MOVIE);
>> +
>> + tag = av_dict_get(st->metadata, "mov-flags", NULL, 0);
>> + if (tag)
>> + flags = atoi(tag->value);
>
> Hmm, this feels a bit more risky to be able to overwrite. Not sure if it
> would make sense to do flags |= atoi() here, although if we allow
> overriding it, perhaps we should allow overriding all of it (and I guess
> you might need that for your usecase). So I guess it's ok - the risk of
> accidentally breaking a file by the mov-flags metadata key being present
> in per-stream metadata is pretty small.
Alternatively we could enable/disable the active bit always.
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index b6f221d..3920a8c 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1476,9 +1476,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb,
MOVTrack *track, AVStream *st)
int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE,
track->timescale, AV_ROUND_UP);
int version = duration < INT32_MAX ? 0 : 1;
- int flags = (track->flags & MOV_TRACK_ENABLED) ?
- MOV_TKHD_FLAG_ENABLED | MOV_TKHD_FLAG_IN_MOVIE :
- MOV_TKHD_FLAG_IN_MOVIE;
+ int flags = MOV_TKHD_FLAG_IN_MOVIE;
int group = st ? st->codec->codec_type : 0;
int layer = 0;
@@ -1495,6 +1493,11 @@ static int mov_write_tkhd_tag(AVIOContext *pb,
MOVTrack *track, AVStream *st)
if (tag)
flags = atoi(tag->value);
+ if (track->flags & MOV_TRACK_ENABLED) {
+ flags |= MOV_TKHD_FLAG_ENABLED;
+ } else {
+ flags &= ~MOV_TKHD_FLAG_ENABLED;
+ }
avio_wb24(pb, flags);
if (version == 1) {
lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel