On 07/26/2014 09:53 AM, John Stebbins wrote:
> ---
> libavformat/movenc.c | 76
> ++++++++++++++++++++++++++++++++++++++++++++--------
> libavformat/movenc.h | 1 +
> 2 files changed, 66 insertions(+), 11 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index f16e851..4ef63f0 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -77,6 +77,17 @@ static const AVClass flavor ## _muxer_class = {\
> .version = LIBAVUTIL_VERSION_INT,\
> };
>
> +static int utf8len(const uint8_t *b)
> +{
> + int len = 0;
> + int val;
> + while (*b) {
> + GET_UTF8(val, *b++, return -1;)
> + len++;
> + }
> + return len;
> +}
> +
> //FIXME support 64 bit variant with wide placeholders
> static int64_t update_size(AVIOContext *pb, int64_t pos)
> {
> @@ -1352,6 +1363,15 @@ 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);
> }
> + if (track->st) {
> + // hdlr.name is used by some players to identify the content
> title
> + // of the track. If we have a title, use it.
> + AVDictionaryEntry *t;
> + t = av_dict_get(track->st->metadata, "title", NULL, 0);
> + if (t && utf8len(t->value)) {
> + descr = t->value;
> + }
> + }
> }
>
> avio_wb32(pb, 0); /* size */
> @@ -1671,6 +1691,48 @@ static int mov_write_udta_sdp(AVIOContext *pb,
> MOVTrack *track)
> return len + 24;
> }
>
> +static int mov_write_track_metadata(AVIOContext *pb, AVStream *st,
> + const char *tag, const char *str)
> +{
> + int64_t pos = avio_tell(pb);
> + AVDictionaryEntry *t = av_dict_get(st->metadata, str, NULL, 0);
> + if (!t || !utf8len(t->value))
> + return 0;
> +
> + avio_wb32(pb, 0); /* size */
> + ffio_wfourcc(pb, tag); /* type */
> + avio_write(pb, t->value, strlen(t->value)); /* UTF8 string value */
> + return update_size(pb, pos);
> +}
> +
> +static int mov_write_track_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
> + AVStream *st)
> +{
> + AVIOContext *pb_buf;
> + int ret, size;
> + uint8_t *buf;
> +
> + if (st == NULL || mov->fc->flags & AVFMT_FLAG_BITEXACT)
> + return 0;
> +
> + ret = avio_open_dyn_buf(&pb_buf);
> + if (ret < 0)
> + return ret;
> +
> + if (mov->mode & MODE_MP4) {
> + mov_write_track_metadata(pb_buf, st, "name", "title");
> + }
> +
> + if ((size = avio_close_dyn_buf(pb_buf, &buf)) > 0) {
> + avio_wb32(pb, size + 8);
> + ffio_wfourcc(pb, "udta");
> + avio_write(pb, buf, size);
> + }
> + av_free(buf);
> +
> + return 0;
> +}
> +
> static int mov_write_trak_tag(AVIOContext *pb, MOVMuxContext *mov,
> MOVTrack *track, AVStream *st)
> {
> @@ -1702,6 +1764,7 @@ static int mov_write_trak_tag(AVIOContext *pb,
> MOVMuxContext *mov,
> mov_write_tapt_tag(pb, track);
> }
> }
> + mov_write_track_udta_tag(pb, mov, st);
> return update_size(pb, pos);
> }
>
> @@ -1959,17 +2022,6 @@ static int mov_write_meta_tag(AVIOContext *pb,
> MOVMuxContext *mov,
> return size;
> }
>
> -static int utf8len(const uint8_t *b)
> -{
> - int len = 0;
> - int val;
> - while (*b) {
> - GET_UTF8(val, *b++, return -1;)
> - len++;
> - }
> - return len;
> -}
> -
> static int ascii_to_wc(AVIOContext *pb, const uint8_t *b)
> {
> int val;
> @@ -3309,6 +3361,8 @@ static int mov_write_header(AVFormatContext *s)
> AVDictionaryEntry *t;
> int i, hint_track = 0;
>
> + mov->fc = s;
> +
> /* Default mode == MP4 */
> mov->mode = MODE_MP4;
>
> diff --git a/libavformat/movenc.h b/libavformat/movenc.h
> index 35be781..c6a31db 100644
> --- a/libavformat/movenc.h
> +++ b/libavformat/movenc.h
> @@ -164,6 +164,7 @@ typedef struct MOVMuxContext {
> char *major_brand;
>
> int per_stream_grouping;
> + AVFormatContext *fc;
> } MOVMuxContext;
>
> #define FF_MOV_FLAG_RTP_HINT 1ping... more comments? I didn't get any second opinions about Luca's suggestion to use a different metadata key for the value stored in the hdlr tag. So I left it as is. If anyone has an opinion about this, please speak up. -- John GnuPG fingerprint: D0EC B3DB C372 D1F1 0B01 83F0 49F1 D7B2 60D4 D0F7
signature.asc
Description: OpenPGP digital signature
_______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
