new avm2 (flash 9) muxer, patch by Paul Egan, paulegan at mail dot com
authorPaul Egan <paulegan@mail.com>
Sun, 20 Jan 2008 18:30:04 +0000 (18:30 +0000)
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>
Sun, 20 Jan 2008 18:30:04 +0000 (18:30 +0000)
Originally committed as revision 11574 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/Makefile
libavformat/allformats.c
libavformat/avformat.h
libavformat/swf.c

index 903751c..43f8c27 100644 (file)
@@ -29,6 +29,7 @@ OBJS-$(CONFIG_AU_MUXER)                  += au.o
 OBJS-$(CONFIG_AVI_DEMUXER)               += avidec.o riff.o
 OBJS-$(CONFIG_AVI_MUXER)                 += avienc.o riff.o
 OBJS-$(CONFIG_AVISYNTH)                  += avisynth.o
+OBJS-$(CONFIG_AVM2_MUXER)                += swf.o
 OBJS-$(CONFIG_AVS_DEMUXER)               += avs.o vocdec.o voc.o
 OBJS-$(CONFIG_BETHSOFTVID_DEMUXER)       += bethsoftvid.o
 OBJS-$(CONFIG_C93_DEMUXER)               += c93.o vocdec.o voc.o
index c1575eb..4988c6a 100644 (file)
@@ -148,6 +148,7 @@ void av_register_all(void)
     REGISTER_DEMUXER  (SOL, sol);
     REGISTER_DEMUXER  (STR, str);
     REGISTER_MUXDEMUX (SWF, swf);
+    REGISTER_MUXER    (AVM2, avm2);
     REGISTER_MUXER    (TG2, tg2);
     REGISTER_MUXER    (TGP, tgp);
     REGISTER_DEMUXER  (THP, thp);
index de62231..cb60245 100644 (file)
@@ -21,8 +21,8 @@
 #ifndef FFMPEG_AVFORMAT_H
 #define FFMPEG_AVFORMAT_H
 
-#define LIBAVFORMAT_VERSION_INT ((52<<16)+(4<<8)+0)
-#define LIBAVFORMAT_VERSION     52.4.0
+#define LIBAVFORMAT_VERSION_INT ((52<<16)+(5<<8)+0)
+#define LIBAVFORMAT_VERSION     52.5.0
 #define LIBAVFORMAT_BUILD       LIBAVFORMAT_VERSION_INT
 
 #define LIBAVFORMAT_IDENT       "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION)
index 087e1c7..405fb68 100644 (file)
@@ -40,6 +40,7 @@
 #define TAG_STREAMHEAD2   45
 #define TAG_VIDEOSTREAM   60
 #define TAG_VIDEOFRAME    61
+#define TAG_FILEATTRIBUTES 69
 
 #define TAG_LONG         0x100
 
@@ -249,6 +250,7 @@ static int swf_write_header(AVFormatContext *s)
     PutBitContext p;
     uint8_t buf1[256];
     int i, width, height, rate, rate_base;
+    int is_avm2;
 
     swf->audio_in_pos = 0;
     swf->sound_samples = 0;
@@ -305,8 +307,12 @@ static int swf_write_header(AVFormatContext *s)
         swf->samples_per_frame = (audio_enc->sample_rate * rate_base) / rate;
     }
 
+    is_avm2 = !strcmp("avm2", s->oformat->name);
+
     put_tag(pb, "FWS");
-    if (video_enc && video_enc->codec_id == CODEC_ID_VP6F) {
+    if (is_avm2) {
+        put_byte(pb, 9);
+    } else if (video_enc && video_enc->codec_id == CODEC_ID_VP6F) {
         put_byte(pb, 8); /* version (version 8 and above support VP6 codec) */
     } else if (video_enc && video_enc->codec_id == CODEC_ID_FLV1) {
         put_byte(pb, 6); /* version (version 6 and above support FLV1 codec) */
@@ -321,6 +327,13 @@ static int swf_write_header(AVFormatContext *s)
     swf->duration_pos = url_ftell(pb);
     put_le16(pb, (uint16_t)(DUMMY_DURATION * (int64_t)rate / rate_base)); /* frame count */
 
+    /* avm2/swf v9 (also v8?) files require a file attribute tag */
+    if (is_avm2) {
+        put_swf_tag(s, TAG_FILEATTRIBUTES);
+        put_le32(pb, 1<<3); /* set ActionScript v3/AVM2 flag */
+        put_swf_end_tag(s);
+    }
+
     /* define a shape with the jpeg inside */
     if (video_enc && (video_enc->codec_id == CODEC_ID_VP6F ||
                        video_enc->codec_id == CODEC_ID_FLV1)) {
@@ -787,3 +800,17 @@ AVOutputFormat swf_muxer = {
     swf_write_trailer,
 };
 #endif
+#ifdef CONFIG_AVM2_MUXER
+AVOutputFormat avm2_muxer = {
+    "avm2",
+    "Flash 9 (AVM2) format",
+    "application/x-shockwave-flash",
+    "swf",
+    sizeof(SWFContext),
+    CODEC_ID_MP3,
+    CODEC_ID_FLV1,
+    swf_write_header,
+    swf_write_packet,
+    swf_write_trailer,
+};
+#endif