* commit '54ed488b1af583df6c9d2a73b4a44f16b7e4f82c': flac muxer: write WAVEFORMATEXTENSIBLE_CHANNEL_MASK tag for multichannel files Conflicts: libavformat/flacenc.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.3
| @@ -19,6 +19,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/channel_layout.h" | |||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "libavcodec/flac.h" | #include "libavcodec/flac.h" | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| @@ -97,6 +98,23 @@ static int flac_write_header(struct AVFormatContext *s) | |||||
| if (ret) | if (ret) | ||||
| return ret; | return ret; | ||||
| /* add the channel layout tag */ | |||||
| if (codec->channel_layout && | |||||
| !(codec->channel_layout & ~0x3ffffULL) && | |||||
| !ff_flac_is_native_layout(codec->channel_layout)) { | |||||
| AVDictionaryEntry *chmask = av_dict_get(s->metadata, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", | |||||
| NULL, 0); | |||||
| if (chmask) { | |||||
| av_log(s, AV_LOG_WARNING, "A WAVEFORMATEXTENSIBLE_CHANNEL_MASK is " | |||||
| "already present, this muxer will not overwrite it.\n"); | |||||
| } else { | |||||
| uint8_t buf[32]; | |||||
| snprintf(buf, sizeof(buf), "0x%"PRIx64, codec->channel_layout); | |||||
| av_dict_set(&s->metadata, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0); | |||||
| } | |||||
| } | |||||
| ret = flac_write_block_comment(s->pb, &s->metadata, !padding, | ret = flac_write_block_comment(s->pb, &s->metadata, !padding, | ||||
| s->flags & AVFMT_FLAG_BITEXACT); | s->flags & AVFMT_FLAG_BITEXACT); | ||||
| if (ret) | if (ret) | ||||
| @@ -29,4 +29,6 @@ | |||||
| int ff_flac_write_header(AVIOContext *pb, AVCodecContext *codec, | int ff_flac_write_header(AVIOContext *pb, AVCodecContext *codec, | ||||
| int last_block); | int last_block); | ||||
| int ff_flac_is_native_layout(uint64_t channel_layout); | |||||
| #endif /* AVFORMAT_FLACENC_H */ | #endif /* AVFORMAT_FLACENC_H */ | ||||
| @@ -19,6 +19,8 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/channel_layout.h" | |||||
| #include "libavcodec/flac.h" | #include "libavcodec/flac.h" | ||||
| #include "libavcodec/bytestream.h" | #include "libavcodec/bytestream.h" | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| @@ -45,3 +47,17 @@ int ff_flac_write_header(AVIOContext *pb, AVCodecContext *codec, | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int ff_flac_is_native_layout(uint64_t channel_layout) | |||||
| { | |||||
| if (channel_layout == AV_CH_LAYOUT_MONO || | |||||
| channel_layout == AV_CH_LAYOUT_STEREO || | |||||
| channel_layout == AV_CH_LAYOUT_SURROUND || | |||||
| channel_layout == AV_CH_LAYOUT_QUAD || | |||||
| channel_layout == AV_CH_LAYOUT_5POINT0 || | |||||
| channel_layout == AV_CH_LAYOUT_5POINT1 || | |||||
| channel_layout == AV_CH_LAYOUT_6POINT1 || | |||||
| channel_layout == AV_CH_LAYOUT_7POINT1) | |||||
| return 1; | |||||
| return 0; | |||||
| } | |||||