[FFmpeg-devel] [PATCH] Add channel label and bitmap values to metadata
Michael Niedermayer
michaelni at gmx.at
Wed Oct 15 01:11:31 CEST 2014
On Fri, Oct 10, 2014 at 11:21:23AM +0100, Billy Shambrook wrote:
> ---
> libavformat/mov_chan.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 75 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c
> index 3b91ed7..aa369f2 100644
> --- a/libavformat/mov_chan.c
> +++ b/libavformat/mov_chan.c
> @@ -133,6 +133,66 @@ enum MovChannelLayoutTag {
> MOV_CH_LAYOUT_DTS_8_1_B = (181 << 16) | 9,
> };
>
> +struct MovChannelLabel {
> + uint32_t code;
> + char name[128];
> +};
> +
> +static const struct MovChannelLabel mov_ch_labels[] = {
> + { 0, "Unused" },
> + { 1, "Left" },
> + { 2, "Right" },
> + { 3, "Center" },
> + { 4, "LFE Screen" },
> + { 5, "Left Surround" },
> + { 6, "Right Surround" },
> + { 7, "Left Center" },
> + { 8, "Right Center" },
> + { 9, "Center Surround" },
> + { 33, "Rear Surround Left" },
> + { 34, "Rear Surround Right" },
> + { 38, "Left Total" },
> + { 39, "Right Total" },
> + { 42, "Mono" },
> + { 65536, "Discrete 0" },
> + { (1<<16) | 1, "Discrete 1" },
> + { (1<<16) | 2, "Discrete 2" },
> + { (1<<16) | 3, "Discrete 3" },
> + { (1<<16) | 4, "Discrete 4" },
> + { (1<<16) | 5, "Discrete 5" },
> + { (1<<16) | 6, "Discrete 6" },
> + { (1<<16) | 7, "Discrete 7" },
> + { (1<<16) | 8, "Discrete 8" },
> + { (1<<16) | 9, "Discrete 9" },
> + { (1<<16) | 10, "Discrete 10" },
> + { (1<<16) | 11, "Discrete 11" },
> + { (1<<16) | 12, "Discrete 12" },
> + { (1<<16) | 13, "Discrete 13" },
> + { (1<<16) | 14, "Discrete 14" },
> + { (1<<16) | 15, "Discrete 15" },
> + { 0xFFFFFFFF, "Unknown" }
> +};
> +
> +struct MovChannelBitmap {
> + uint32_t code;
> + char name[128];
> +};
> +
> +static const struct MovChannelBitmap mov_ch_bitmap[] = {
> + { (1 << 0), "Left" },
> + { (1 << 1), "Right" },
> + { (1 << 2), "Center" },
> + { (1 << 3), "LFE Screen" },
> + { (1 << 4), "Left Surround" },
> + { (1 << 5), "Right Surround" },
> + { (1 << 6), "Left Center" },
> + { (1 << 7), "Right Center" },
> + { (1 << 8), "Center Surround" },
> + { (1 << 9), "Left Surround Direct" },
> + { (1 << 10), "Rear Surround Direct" },
> + { 0xFFFFFFFF, "Unknown" }
> +};
> +
> struct MovChannelLayoutMap {
> uint32_t tag;
> uint64_t layout;
> @@ -548,7 +608,8 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st,
> int64_t size)
> {
> uint32_t layout_tag, bitmap, num_descr, label_mask;
> - int i;
> + int i, j;
> + char label_tag[16];
>
> if (size < 12)
> return AVERROR_INVALIDDATA;
> @@ -572,6 +633,13 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st,
> avio_rl32(pb); // mCoordinates[1]
> avio_rl32(pb); // mCoordinates[2]
> size -= 20;
> + for (j = 0; mov_ch_labels[j].code != 0xFFFFFFFF; j++) {
> + if (mov_ch_labels[j].code == label){
> + snprintf(label_tag, sizeof(label_tag), "channel_label_%d", i);
> + av_dict_set(&st->metadata, label_tag, mov_ch_labels[j].name, 0);
> + break;
> + }
> + }
> if (layout_tag == 0) {
> uint32_t mask_incr = mov_get_channel_label(label);
> if (mask_incr == 0) {
> @@ -585,6 +653,12 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st,
> if (label_mask)
> st->codec->channel_layout = label_mask;
> } else
> + for (i = 0; mov_ch_bitmap[i].code != 0xFFFFFFFF; i++) {
> + if (mov_ch_bitmap[i].code == bitmap){
> + av_dict_set(&st->metadata, "channel_bitmap", mov_ch_bitmap[i].name, 0);
> + break;
> + }
> + }
> st->codec->channel_layout = ff_mov_get_channel_layout(layout_tag, bitmap);
missing {}
also the metadata has to be discarded if the channel layout is
changed in a filter as it would no longer match but
would be stored in the destination file
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I know you won't believe me, but the highest form of Human Excellence is
to question oneself and others. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141015/cd1c6038/attachment.asc>
More information about the ffmpeg-devel
mailing list