changeset 6065:441608273a5c libavformat

Use ff_rm_codec_tags[] in RM muxer. This, incidentally, also allows muxing other audio codecs rather than only AC-3, so add some code that makes word byte-swapping only happen for AC-3, not for all audio codecs. Patch by Francesco Lavra <francescolavra interfree it>.
author rbultje
date Fri, 28 May 2010 18:21:25 +0000
parents 87e28edf7a98
children 490c440a53e7
files rmenc.c
diffstat 1 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rmenc.c	Fri May 28 18:18:33 2010 +0000
+++ b/rmenc.c	Fri May 28 18:21:25 2010 +0000
@@ -60,7 +60,7 @@
     }
 }
 
-static void rv10_write_header(AVFormatContext *ctx,
+static int rv10_write_header(AVFormatContext *ctx,
                               int data_size, int index_pos)
 {
     RMMuxContext *rm = ctx->priv_data;
@@ -225,7 +225,13 @@
             put_be32(s, 0x10); /* unknown */
             put_be16(s, stream->enc->channels);
             put_str8(s, "Int0"); /* codec name */
-            put_str8(s, "dnet"); /* codec name */
+            if (stream->enc->codec_tag) {
+                put_byte(s, 4); /* tag length */
+                put_le32(s, stream->enc->codec_tag);
+            } else {
+                av_log(ctx, AV_LOG_ERROR, "Invalid codec tag\n");
+                return -1;
+            }
             put_be16(s, 0); /* title length */
             put_be16(s, 0); /* author length */
             put_be16(s, 0); /* copyright length */
@@ -270,6 +276,7 @@
 
     put_be32(s, nb_packets); /* number of packets */
     put_be32(s,0); /* next data header */
+    return 0;
 }
 
 static void write_packet_header(AVFormatContext *ctx, StreamInfo *stream,
@@ -330,7 +337,8 @@
         }
     }
 
-    rv10_write_header(s, 0, 0);
+    if (rv10_write_header(s, 0, 0))
+        return AVERROR_INVALIDDATA;
     put_flush_packet(s->pb);
     return 0;
 }
@@ -348,12 +356,16 @@
 
     write_packet_header(s, stream, size, !!(flags & AV_PKT_FLAG_KEY));
 
+    if (stream->enc->codec_id == CODEC_ID_AC3) {
     /* for AC-3, the words seem to be reversed */
     for(i=0;i<size;i+=2) {
         buf1[i] = buf[i+1];
         buf1[i+1] = buf[i];
     }
     put_buffer(pb, buf1, size);
+    } else {
+        put_buffer(pb, buf, size);
+    }
     put_flush_packet(pb);
     stream->nb_frames++;
     av_free(buf1);
@@ -456,4 +468,5 @@
     rm_write_header,
     rm_write_packet,
     rm_write_trailer,
+    .codec_tag= (const AVCodecTag* const []){ff_rm_codec_tags, 0},
 };