Give priority to the native tags when encoding.
---
 libavformat/nut.c    | 20 ++++++++++++++++++++
 libavformat/nut.h    |  1 +
 libavformat/nutdec.c |  9 +++++++--
 libavformat/nutenc.c | 20 ++++++++++++++------
 4 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/libavformat/nut.c b/libavformat/nut.c
index 4e46b98..0e866da 100644
--- a/libavformat/nut.c
+++ b/libavformat/nut.c
@@ -89,6 +89,26 @@ const AVCodecTag ff_nut_video_tags[] = {
     { AV_CODEC_ID_NONE    , 0                         }
 };
 
+const AVCodecTag ff_nut_audio_tags[] = {
+    { AV_CODEC_ID_PCM_ALAW,  MKTAG('A', 'L', 'A', 'W') },
+    { AV_CODEC_ID_PCM_MULAW, MKTAG('U', 'L', 'A', 'W') },
+    { AV_CODEC_ID_PCM_S16BE, MKTAG(16 , 'D', 'S', 'P') },
+    { AV_CODEC_ID_PCM_S16LE, MKTAG('P', 'S', 'D', 16 ) },
+    { AV_CODEC_ID_PCM_S24BE, MKTAG(24 , 'D', 'S', 'P') },
+    { AV_CODEC_ID_PCM_S24LE, MKTAG('P', 'S', 'D', 24 ) },
+    { AV_CODEC_ID_PCM_S32BE, MKTAG(32 , 'D', 'S', 'P') },
+    { AV_CODEC_ID_PCM_S32LE, MKTAG('P', 'S', 'D', 32 ) },
+    { AV_CODEC_ID_PCM_S8,    MKTAG('P', 'S', 'D',  8 ) },
+    { AV_CODEC_ID_PCM_U16BE, MKTAG(16 , 'D', 'U', 'P') },
+    { AV_CODEC_ID_PCM_U16LE, MKTAG('P', 'U', 'D', 16 ) },
+    { AV_CODEC_ID_PCM_U24BE, MKTAG(24 , 'D', 'U', 'P') },
+    { AV_CODEC_ID_PCM_U24LE, MKTAG('P', 'U', 'D', 24 ) },
+    { AV_CODEC_ID_PCM_U32BE, MKTAG(32 , 'D', 'U', 'P') },
+    { AV_CODEC_ID_PCM_U32LE, MKTAG('P', 'U', 'D', 32 ) },
+    { AV_CODEC_ID_PCM_U8,    MKTAG('P', 'U', 'D',  8 ) },
+    { AV_CODEC_ID_NONE,      0                         }
+};
+
 void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val){
     int i;
     for(i=0; i<nut->avf->nb_streams; i++){
diff --git a/libavformat/nut.h b/libavformat/nut.h
index 3f09689..933b9c5 100644
--- a/libavformat/nut.h
+++ b/libavformat/nut.h
@@ -105,6 +105,7 @@ typedef struct NUTContext {
 
 extern const AVCodecTag ff_nut_subtitle_tags[];
 extern const AVCodecTag ff_nut_video_tags[];
+extern const AVCodecTag ff_nut_audio_tags[];
 
 typedef struct Dispositions {
     char str[9];
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index dd02aad..a3ff2e6 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -358,7 +358,12 @@ static int decode_stream_header(NUTContext *nut)
         break;
     case 1:
         st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
-        st->codec->codec_id   = ff_codec_get_id(ff_codec_wav_tags, tmp);
+        st->codec->codec_id   = av_codec_get_id((const AVCodecTag * const []) {
+                                                    ff_codec_wav_tags,
+                                                    ff_nut_audio_tags,
+                                                    0
+                                                },
+                                                tmp);
         break;
     case 2:
         st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
@@ -993,6 +998,6 @@ AVInputFormat ff_nut_demuxer = {
     .extensions     = "nut",
     .codec_tag      = (const AVCodecTag * const []) {
         ff_codec_bmp_tags, ff_nut_video_tags, ff_codec_wav_tags,
-        ff_nut_subtitle_tags, 0
+        ff_nut_subtitle_tags, ff_nut_audio_tags, 0
     },
 };
diff --git a/libavformat/nutenc.c b/libavformat/nutenc.c
index 4b1e663..ba79d8f 100644
--- a/libavformat/nutenc.c
+++ b/libavformat/nutenc.c
@@ -371,9 +371,16 @@ static void write_mainheader(NUTContext *nut, AVIOContext 
*bc){
     }
 }
 
+static const AVCodecTag * const nut_codec_tags[] = {
+    ff_nut_audio_tags, ff_nut_video_tags, ff_nut_subtitle_tags,
+    ff_codec_bmp_tags, ff_codec_wav_tags, 0
+};
+
 static int write_streamheader(AVFormatContext *avctx, AVIOContext *bc, 
AVStream *st, int i){
     NUTContext *nut = avctx->priv_data;
     AVCodecContext *codec = st->codec;
+    unsigned codec_tag = av_codec_get_tag(nut_codec_tags, codec->codec_id);
+
     ff_put_v(bc, i);
     switch(codec->codec_type){
     case AVMEDIA_TYPE_VIDEO: ff_put_v(bc, 0); break;
@@ -382,8 +389,12 @@ static int write_streamheader(AVFormatContext *avctx, 
AVIOContext *bc, AVStream
     default              : ff_put_v(bc, 3); break;
     }
     ff_put_v(bc, 4);
-    if (codec->codec_tag){
-        avio_wl32(bc, codec->codec_tag);
+
+    if (!codec_tag)
+        codec_tag = codec->codec_tag;
+
+    if (codec_tag) {
+        avio_wl32(bc, codec_tag);
     } else {
         av_log(avctx, AV_LOG_ERROR, "No codec tag defined for stream %d\n", i);
         return AVERROR(EINVAL);
@@ -873,8 +884,5 @@ AVOutputFormat ff_nut_muxer = {
     .write_packet   = nut_write_packet,
     .write_trailer  = nut_write_trailer,
     .flags          = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
-    .codec_tag      = (const AVCodecTag * const []){
-        ff_codec_bmp_tags, ff_nut_video_tags, ff_codec_wav_tags,
-        ff_nut_subtitle_tags, 0
-    },
+    .codec_tag      = nut_codec_tags,
 };
-- 
1.7.12

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to