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 1

ping... 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


Attachment: signature.asc
Description: OpenPGP digital signature

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

Reply via email to