1 /*
2 * Flash Compatible Streaming Format muxer
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
27
29 {
32
35 /* reserve some room for the tag */
39 } else {
41 }
42 }
43
45 {
48 int64_t pos;
50
52 tag_len = pos - swf->
tag_pos - 2;
56 tag &= ~TAG_LONG;
59 } else {
62 }
64 }
65
67 {
69
70 if (val == 0)
71 return;
73 n = 1;
74 while (val != 0) {
75 n++;
76 val >>= 1;
77 }
78 if (n > *nbits_ptr)
80 }
81
83 int xmin, int xmax, int ymin, int ymax)
84 {
88
90
91 nbits = 0;
96 mask = (1 << nbits) - 1;
97
98 /* rectangle info */
104
107 }
108
110 {
112
114 put_bits(pb, 1, 1);
/* line select */
115 nbits = 2;
118
119 mask = (1 << nbits) - 1;
120 put_bits(pb, 4, nbits - 2);
/* 16 bits precision */
121 if (dx == 0) {
125 } else if (dy == 0) {
129 } else {
133 }
134 }
135
137
139 int a,
int b,
int c,
int d,
int tx,
int ty)
140 {
143 int nbits;
144
146
147 put_bits(&p, 1, 1);
/* a, d present */
148 nbits = 1;
151 put_bits(&p, 5, nbits);
/* nb bits */
154
155 put_bits(&p, 1, 1);
/* b, c present */
156 nbits = 1;
159 put_bits(&p, 5, nbits);
/* nb bits */
162
163 nbits = 1;
166 put_bits(&p, 5, nbits);
/* nb bits */
169
172 }
173
175 {
182
186
193 }
199 } else {
201 return -1;
202 }
203 } else {
207 }
213 } else {
215 return -1;
216 }
217 }
218 }
219
221 /* currently, cannot work correctly if audio only */
222 width = 320;
223 height = 200;
224 rate = 10;
225 rate_base= 1;
226 } else {
229 // TODO: should be avg_frame_rate
232 }
233
236 else
238
240
242 version = 9;
244 version = 8; /* version 8 and above support VP6 codec */
246 version = 6; /* version 6 and above support FLV1 codec */
247 else
248 version = 4; /* version 4 for mpeg audio support */
250
252 (will be patched if not streamed) */
253
255 if ((rate * 256LL) / rate_base >= (1<<16)) {
258 }
259 avio_wl16(pb, (rate * 256) / rate_base);
/* frame rate */
262
263 /* avm2/swf v9 (also v8?) files require a file attribute tag */
264 if (version == 9) {
266 avio_wl32(pb, 1<<3);
/* set ActionScript v3/AVM2 flag */
268 }
269
270 /* define a shape with the jpeg inside */
273
275 /* bounding rectangle */
277 /* style info */
278 avio_w8(pb, 1);
/* one fill style */
279 avio_w8(pb, 0x41);
/* clipped bitmap fill */
281 /* position of the bitmap */
284 avio_w8(pb, 0);
/* no line style */
285
286 /* shape drawing */
288 put_bits(&p, 4, 1);
/* one fill bit */
289 put_bits(&p, 4, 0);
/* zero line bit */
290
291 put_bits(&p, 1, 0);
/* not an edge */
296 put_bits(&p, 1, 1);
/* set fill style 1 */
297
298 /* draw the rectangle ! */
303
304 /* end of shape */
305 put_bits(&p, 1, 0);
/* not an edge */
307
310
312 }
313
315 int v = 0;
316
317 /* start sound */
320 case 11025: v |= 1 << 2; break;
321 case 22050: v |= 2 << 2; break;
322 case 44100: v |= 3 << 2; break;
323 default:
324 /* not supported */
325 av_log(s,
AV_LOG_ERROR,
"swf does not support that sample rate, choose from (44100, 22050, 11025).\n");
326 return -1;
327 }
328 v |= 0x02; /* 16 bit playback */
330 v |= 0x01; /* stereo playback */
332 v |= 0x20; /* mp3 compressed */
336
338 }
339
341 return 0;
342 }
343
346 {
349
350 /* Flash Player limit */
353
357 /* create a new video object */
361 avio_wl16(pb, 15000);
/* hard flash player limit */
367
368 /* place the video object for the first time */
378 } else {
379 /* mark the character for update */
385 }
386
387 /* set video frame data */
395 /* remove the shape */
400
401 /* free the bitmap */
405 }
406
408
410
411 /* a dummy jpeg header seems to be required */
413 /* write the jpeg image */
415
417
418 /* draw the shape */
419
425 }
426
428
429 /* streaming sound always should be placed just before showframe tags */
437
438 /* update FIFO */
440 }
441
442 /* output the frame */
445
446 return 0;
447 }
448
451 {
453
454 /* Flash Player limit */
457
460 return -1;
461 }
462
465
466 /* if audio only stream make sure we add swf frames */
469
470 return 0;
471 }
472
474 {
478 else
480 }
481
483 {
487 int file_size, i;
488
493 video_par = par;
494 else {
496 }
497 }
498
501
502 /* patch file size and number of frames if not streamed */
512 }
514 }
515 return 0;
516 }
517
518 #if CONFIG_SWF_MUXER
522 .mime_type = "application/x-shockwave-flash",
523 .extensions = "swf",
531 };
532 #endif
533 #if CONFIG_AVM2_MUXER
537 .mime_type = "application/x-shockwave-flash",
545 };
546 #endif
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
const AVCodecTag ff_swf_codec_tags[]
const char const char void * val
void avio_wl16(AVIOContext *s, unsigned int val)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
This struct describes the properties of an encoded stream.
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
void avio_wl32(AVIOContext *s, unsigned int val)
AVStream ** streams
A list of all streams in the file.
AVCodecParameters * video_par
static void put_swf_rect(AVIOContext *pb, int xmin, int xmax, int ymin, int ymax)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
static void put_swf_line_edge(PutBitContext *pb, int dx, int dy)
struct AVOutputFormat * oformat
The output container format.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
static const uint16_t mask[17]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
preferred ID for decoding MPEG audio layer 1, 2 or 3
enum AVMediaType codec_type
General type of the encoded data.
simple assert() macros that are a bit more flexible than ISO C assert().
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
This function is the same as av_get_audio_frame_duration(), except it works with AVCodecParameters in...
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
int void avio_flush(AVIOContext *s)
Force flushing of buffered data.
static int swf_write_audio(AVFormatContext *s, AVCodecParameters *par, uint8_t *buf, int size)
static void put_swf_tag(AVFormatContext *s, int tag)
static void max_nbits(int *nbits_ptr, int val)
static int write_trailer(AVFormatContext *s1)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static int swf_write_packet(AVFormatContext *s, AVPacket *pkt)
static int swf_write_video(AVFormatContext *s, AVCodecParameters *par, const uint8_t *buf, int size)
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
#define AV_LOG_INFO
Standard information.
static int swf_write_header(AVFormatContext *s)
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
AVIOContext * pb
I/O context.
void avio_w8(AVIOContext *s, int b)
AVCodecParameters * audio_par
int sample_rate
Audio only.
static void put_swf_end_tag(AVFormatContext *s)
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
void * priv_data
Format private data.
static void write_header(FFV1Context *f)
void avio_wb32(AVIOContext *s, unsigned int val)
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
AVFifoBuffer * audio_fifo
static int swf_write_trailer(AVFormatContext *s)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
static void put_swf_matrix(AVIOContext *pb, int a, int b, int c, int d, int tx, int ty)
This structure stores compressed data.