1 /*
2  * Flash Compatible Streaming Format common header.
3  * Copyright (c) 2000 Fabrice Bellard
4  * Copyright (c) 2003 Tinic Uro
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVFORMAT_SWF_H
24 #define AVFORMAT_SWF_H
25 
26 #include "config.h"
27 
28 #if CONFIG_ZLIB
29 #include <zlib.h>
30 #endif
31 
32 #include "libavutil/fifo.h"
33 #include "avformat.h"
34 #include "avio.h"
35 #include "internal.h"
36 
37 /* should have a generic way to indicate probable size */
38 #define DUMMY_FILE_SIZE   (100 * 1024 * 1024)
39 #define DUMMY_DURATION    600 /* in seconds */
40 
41 enum {
42     TAG_END                          =  0,
43     TAG_SHOWFRAME                    =  1,
44     TAG_DEFINESHAPE                  =  2,
45     TAG_FREECHARACTER                =  3,
46     TAG_PLACEOBJECT                  =  4,
47     TAG_REMOVEOBJECT                 =  5,
48     TAG_DEFINEBITS                   =  6,
49     TAG_DEFINEBUTTON                 =  7,
50     TAG_JPEGTABLES                   =  8,
51     TAG_SETBACKGROUNDCOLOR           =  9,
52     TAG_DEFINEFONT                   = 10,
53     TAG_DEFINETEXT                   = 11,
54     TAG_DOACTION                     = 12,
55     TAG_DEFINEFONTINFO               = 13,
56     TAG_DEFINESOUND                  = 14,
57     TAG_STARTSOUND                   = 15,
58     TAG_DEFINEBUTTONSOUND            = 17,
59     TAG_STREAMHEAD                   = 18,
60     TAG_STREAMBLOCK                  = 19,
61     TAG_DEFINEBITSLOSSLESS           = 20,
62     TAG_JPEG2                        = 21,
63     TAG_DEFINESHAPE2                 = 22,
64     TAG_DEFINEBUTTONCXFORM           = 23,
65     TAG_PROTECT                      = 24,
66     TAG_PLACEOBJECT2                 = 26,
67     TAG_REMOVEOBJECT2                = 28,
68     TAG_DEFINESHAPE3                 = 32,
69     TAG_DEFINETEXT2                  = 33,
70     TAG_DEFINEBUTTON2                = 34,
71     TAG_DEFINEBITSJPEG3              = 35,
72     TAG_DEFINEBITSLOSSLESS2          = 36,
73     TAG_DEFINEEDITTEXT               = 37,
74     TAG_DEFINESPRITE                 = 39,
75     TAG_FRAMELABEL                   = 43,
76     TAG_STREAMHEAD2                  = 45,
77     TAG_DEFINEMORPHSHAPE             = 46,
78     TAG_DEFINEFONT2                  = 48,
79     TAG_EXPORTASSETS                 = 56,
80     TAG_IMPORTASSETS                 = 57,
81     TAG_ENABLEDEBUGGER               = 58,
82     TAG_DOINITACTION                 = 59,
83     TAG_VIDEOSTREAM                  = 60,
84     TAG_VIDEOFRAME                   = 61,
85     TAG_DEFINEFONTINFO2              = 62,
86     TAG_ENABLEDEBUGGER2              = 64,
87     TAG_SCRIPTLIMITS                 = 65,
88     TAG_SETTABINDEX                  = 66,
89     TAG_FILEATTRIBUTES               = 69,
90     TAG_PLACEOBJECT3                 = 70,
91     TAG_IMPORTASSETS2                = 71,
92     TAG_DEFINEFONTALIGNZONES         = 73,
93     TAG_CSMTEXTSETTINGS              = 74,
94     TAG_DEFINEFONT3                  = 75,
95     TAG_SYMBOLCLASS                  = 76,
96     TAG_METADATA                     = 77,
97     TAG_DEFINESCALINGGRID            = 78,
98     TAG_DOABC                        = 82,
99     TAG_DEFINESHAPE4                 = 83,
100     TAG_DEFINEMORPHSHAPE2            = 84,
101     TAG_DEFINESCENEANDFRAMELABELDATA = 86,
102     TAG_DEFINEBINARYDATA             = 87,
103     TAG_DEFINEFONTNAME               = 88,
104     TAG_STARTSOUND2                  = 89,
105     TAG_DEFINEBITSJPEG4              = 90,
106     TAG_DEFINEFONT4                  = 91,
107 };
108 
109 #define TAG_LONG         0x100
110 
111 /* flags for shape definition */
112 #define FLAG_MOVETO      0x01
113 #define FLAG_SETFILL0    0x02
114 #define FLAG_SETFILL1    0x04
115 
116 #define AUDIO_FIFO_SIZE 65536
117 
118 /* character id used */
119 #define BITMAP_ID 0
120 #define VIDEO_ID 0
121 #define SHAPE_ID  1
122 
123 typedef struct SWFContext {
124     int64_t duration_pos;
125     int64_t tag_pos;
126     int64_t vframes_pos;
127     int samples_per_frame;
128     int sound_samples;
129     int swf_frame_number;
130     int video_frame_number;
131     int frame_rate;
132     int tag;
133     AVFifoBuffer *audio_fifo;
134     AVCodecParameters *audio_par, *video_par;
135     AVStream *video_st;
136 #if CONFIG_ZLIB
137 #define ZBUF_SIZE 4096
138     AVIOContext *zpb;
139     uint8_t *zbuf_in;
140     uint8_t *zbuf_out;
141     z_stream zstream;
142 #endif
143 } SWFContext;
144 
145 extern const AVCodecTag ff_swf_codec_tags[];
146 
147 #endif /* AVFORMAT_SWF_H */
148