swfdec.c
Go to the documentation of this file.
1 /*
2  * Flash Compatible Streaming Format demuxer
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 #include "libavutil/avassert.h"
25 #include "libavutil/imgutils.h"
26 #include "libavutil/intreadwrite.h"
27 #include "swf.h"
28 
29 static const AVCodecTag swf_audio_codec_tags[] = {
30  { AV_CODEC_ID_PCM_S16LE, 0x00 },
31  { AV_CODEC_ID_ADPCM_SWF, 0x01 },
32  { AV_CODEC_ID_MP3, 0x02 },
33  { AV_CODEC_ID_PCM_S16LE, 0x03 },
34 // { AV_CODEC_ID_NELLYMOSER, 0x06 },
35  { AV_CODEC_ID_NONE, 0 },
36 };
37 
38 static int get_swf_tag(AVIOContext *pb, int *len_ptr)
39 {
40  int tag, len;
41 
42  if (url_feof(pb))
43  return AVERROR_EOF;
44 
45  tag = avio_rl16(pb);
46  len = tag & 0x3f;
47  tag = tag >> 6;
48  if (len == 0x3f) {
49  len = avio_rl32(pb);
50  }
51  *len_ptr = len;
52  return tag;
53 }
54 
55 
56 static int swf_probe(AVProbeData *p)
57 {
58  /* check file header */
59  if ((p->buf[0] == 'F' || p->buf[0] == 'C') && p->buf[1] == 'W' &&
60  p->buf[2] == 'S')
61  return AVPROBE_SCORE_MAX;
62  else
63  return 0;
64 }
65 
66 #if CONFIG_ZLIB
67 static int zlib_refill(void *opaque, uint8_t *buf, int buf_size)
68 {
69  AVFormatContext *s = opaque;
70  SWFContext *swf = s->priv_data;
71  z_stream *z = &swf->zstream;
72  int ret;
73 
74 retry:
75  if (!z->avail_in) {
76  int n = avio_read(s->pb, swf->zbuf_in, ZBUF_SIZE);
77  if (n < 0)
78  return n;
79  z->next_in = swf->zbuf_in;
80  z->avail_in = n;
81  }
82 
83  z->next_out = buf;
84  z->avail_out = buf_size;
85 
86  ret = inflate(z, Z_NO_FLUSH);
87  if (ret < 0)
88  return AVERROR(EINVAL);
89  if (ret == Z_STREAM_END)
90  return AVERROR_EOF;
91 
92  if (buf_size - z->avail_out == 0)
93  goto retry;
94 
95  return buf_size - z->avail_out;
96 }
97 #endif
98 
100 {
101  SWFContext *swf = s->priv_data;
102  AVIOContext *pb = s->pb;
103  int nbits, len, tag;
104 
105  tag = avio_rb32(pb) & 0xffffff00;
106  avio_rl32(pb);
107 
108  if (tag == MKBETAG('C', 'W', 'S', 0)) {
109  av_log(s, AV_LOG_INFO, "SWF compressed file detected\n");
110 #if CONFIG_ZLIB
111  swf->zbuf_in = av_malloc(ZBUF_SIZE);
112  swf->zbuf_out = av_malloc(ZBUF_SIZE);
113  swf->zpb = avio_alloc_context(swf->zbuf_out, ZBUF_SIZE, 0, s,
114  zlib_refill, NULL, NULL);
115  if (!swf->zbuf_in || !swf->zbuf_out || !swf->zpb)
116  return AVERROR(ENOMEM);
117  swf->zpb->seekable = 0;
118  if (inflateInit(&swf->zstream) != Z_OK) {
119  av_log(s, AV_LOG_ERROR, "Unable to init zlib context\n");
120  return AVERROR(EINVAL);
121  }
122  pb = swf->zpb;
123 #else
124  av_log(s, AV_LOG_ERROR, "zlib support is required to read SWF compressed files\n");
125  return AVERROR(EIO);
126 #endif
127  } else if (tag != MKBETAG('F', 'W', 'S', 0))
128  return AVERROR(EIO);
129  /* skip rectangle size */
130  nbits = avio_r8(pb) >> 3;
131  len = (4 * nbits - 3 + 7) / 8;
132  avio_skip(pb, len);
133  swf->frame_rate = avio_rl16(pb); /* 8.8 fixed */
134  avio_rl16(pb); /* frame count */
135 
136  swf->samples_per_frame = 0;
138  return 0;
139 }
140 
142 {
143  int sample_rate_code, sample_size_code;
144  AVStream *ast = avformat_new_stream(s, NULL);
145  if (!ast)
146  return NULL;
147  ast->id = id;
148  if (info & 1) {
149  ast->codec->channels = 2;
151  } else {
152  ast->codec->channels = 1;
154  }
156  ast->codec->codec_id = ff_codec_get_id(swf_audio_codec_tags, info>>4 & 15);
158  sample_rate_code = info>>2 & 3;
159  sample_size_code = info>>1 & 1;
160  if (!sample_size_code && ast->codec->codec_id == AV_CODEC_ID_PCM_S16LE)
162  ast->codec->sample_rate = 44100 >> (3 - sample_rate_code);
163  avpriv_set_pts_info(ast, 64, 1, ast->codec->sample_rate);
164  return ast;
165 }
166 
168 {
169  SWFContext *swf = s->priv_data;
170  AVIOContext *pb = s->pb;
171  AVStream *vst = NULL, *ast = NULL, *st = 0;
172  int tag, len, i, frame, v, res;
173 
174 #if CONFIG_ZLIB
175  if (swf->zpb)
176  pb = swf->zpb;
177 #endif
178 
179  for(;;) {
180  uint64_t pos = avio_tell(pb);
181  tag = get_swf_tag(pb, &len);
182  if (tag < 0)
183  return tag;
184  if (len < 0) {
185  av_log(s, AV_LOG_ERROR, "invalid tag length: %d\n", len);
186  return AVERROR_INVALIDDATA;
187  }
188  if (tag == TAG_VIDEOSTREAM) {
189  int ch_id = avio_rl16(pb);
190  len -= 2;
191 
192  for (i=0; i<s->nb_streams; i++) {
193  st = s->streams[i];
194  if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->id == ch_id)
195  goto skip;
196  }
197 
198  avio_rl16(pb);
199  avio_rl16(pb);
200  avio_rl16(pb);
201  avio_r8(pb);
202  /* Check for FLV1 */
203  vst = avformat_new_stream(s, NULL);
204  if (!vst)
205  return AVERROR(ENOMEM);
206  vst->id = ch_id;
209  avpriv_set_pts_info(vst, 16, 256, swf->frame_rate);
210  len -= 8;
211  } else if (tag == TAG_STREAMHEAD || tag == TAG_STREAMHEAD2) {
212  /* streaming found */
213 
214  for (i=0; i<s->nb_streams; i++) {
215  st = s->streams[i];
216  if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->id == -1)
217  goto skip;
218  }
219 
220  avio_r8(pb);
221  v = avio_r8(pb);
222  swf->samples_per_frame = avio_rl16(pb);
223  ast = create_new_audio_stream(s, -1, v); /* -1 to avoid clash with video stream ch_id */
224  if (!ast)
225  return AVERROR(ENOMEM);
226  len -= 4;
227  } else if (tag == TAG_DEFINESOUND) {
228  /* audio stream */
229  int ch_id = avio_rl16(pb);
230 
231  for (i=0; i<s->nb_streams; i++) {
232  st = s->streams[i];
233  if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->id == ch_id)
234  goto skip;
235  }
236 
237  // FIXME: The entire audio stream is stored in a single chunk/tag. Normally,
238  // these are smaller audio streams in DEFINESOUND tags, but it's technically
239  // possible they could be huge. Break it up into multiple packets if it's big.
240  v = avio_r8(pb);
241  ast = create_new_audio_stream(s, ch_id, v);
242  if (!ast)
243  return AVERROR(ENOMEM);
244  ast->duration = avio_rl32(pb); // number of samples
245  if (((v>>4) & 15) == 2) { // MP3 sound data record
246  ast->skip_samples = avio_rl16(pb);
247  len -= 2;
248  }
249  len -= 7;
250  if ((res = av_get_packet(pb, pkt, len)) < 0)
251  return res;
252  pkt->pos = pos;
253  pkt->stream_index = ast->index;
254  return pkt->size;
255  } else if (tag == TAG_VIDEOFRAME) {
256  int ch_id = avio_rl16(pb);
257  len -= 2;
258  for(i=0; i<s->nb_streams; i++) {
259  st = s->streams[i];
260  if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->id == ch_id) {
261  frame = avio_rl16(pb);
262  len -= 2;
263  if (len <= 0)
264  goto skip;
265  if ((res = av_get_packet(pb, pkt, len)) < 0)
266  return res;
267  pkt->pos = pos;
268  pkt->pts = frame;
269  pkt->stream_index = st->index;
270  return pkt->size;
271  }
272  }
273  } else if (tag == TAG_DEFINEBITSLOSSLESS || tag == TAG_DEFINEBITSLOSSLESS2) {
274 #if CONFIG_ZLIB
275  long out_len;
276  uint8_t *buf = NULL, *zbuf = NULL, *pal;
277  uint32_t colormap[AVPALETTE_COUNT] = {0};
278  const int alpha_bmp = tag == TAG_DEFINEBITSLOSSLESS2;
279  const int colormapbpp = 3 + alpha_bmp;
280  int linesize, colormapsize = 0;
281 
282  const int ch_id = avio_rl16(pb);
283  const int bmp_fmt = avio_r8(pb);
284  const int width = avio_rl16(pb);
285  const int height = avio_rl16(pb);
286 
287  len -= 2+1+2+2;
288 
289  switch (bmp_fmt) {
290  case 3: // PAL-8
291  linesize = width;
292  colormapsize = avio_r8(pb) + 1;
293  len--;
294  break;
295  case 4: // RGB15
296  linesize = width * 2;
297  break;
298  case 5: // RGB24 (0RGB)
299  linesize = width * 4;
300  break;
301  default:
302  av_log(s, AV_LOG_ERROR, "invalid bitmap format %d, skipped\n", bmp_fmt);
303  goto bitmap_end_skip;
304  }
305 
306  linesize = FFALIGN(linesize, 4);
307 
308  if (av_image_check_size(width, height, 0, s) < 0 ||
309  linesize >= INT_MAX / height ||
310  linesize * height >= INT_MAX - colormapsize * colormapbpp) {
311  av_log(s, AV_LOG_ERROR, "invalid frame size %dx%d\n", width, height);
312  goto bitmap_end_skip;
313  }
314 
315  out_len = colormapsize * colormapbpp + linesize * height;
316 
317  av_dlog(s, "bitmap: ch=%d fmt=%d %dx%d (linesize=%d) len=%d->%ld pal=%d\n",
318  ch_id, bmp_fmt, width, height, linesize, len, out_len, colormapsize);
319 
320  zbuf = av_malloc(len);
321  buf = av_malloc(out_len);
322  if (!zbuf || !buf) {
323  res = AVERROR(ENOMEM);
324  goto bitmap_end;
325  }
326 
327  len = avio_read(pb, zbuf, len);
328  if (len < 0 || (res = uncompress(buf, &out_len, zbuf, len)) != Z_OK) {
329  av_log(s, AV_LOG_WARNING, "Failed to uncompress one bitmap\n");
330  goto bitmap_end_skip;
331  }
332 
333  for (i = 0; i < s->nb_streams; i++) {
334  st = s->streams[i];
335  if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && st->id == -3)
336  break;
337  }
338  if (i == s->nb_streams) {
339  vst = avformat_new_stream(s, NULL);
340  if (!vst) {
341  res = AVERROR(ENOMEM);
342  goto bitmap_end;
343  }
344  vst->id = -3; /* -3 to avoid clash with video stream and audio stream */
347  avpriv_set_pts_info(vst, 64, 256, swf->frame_rate);
348  st = vst;
349  }
350  st->codec->width = width;
351  st->codec->height = height;
352 
353  if ((res = av_new_packet(pkt, out_len - colormapsize * colormapbpp)) < 0)
354  goto bitmap_end;
355  pkt->pos = pos;
356  pkt->stream_index = st->index;
357 
358  switch (bmp_fmt) {
359  case 3:
360  st->codec->pix_fmt = AV_PIX_FMT_PAL8;
361  for (i = 0; i < colormapsize; i++)
362  if (alpha_bmp) colormap[i] = buf[3]<<24 | AV_RB24(buf + 4*i);
363  else colormap[i] = 0xffU <<24 | AV_RB24(buf + 3*i);
365  if (!pal) {
366  res = AVERROR(ENOMEM);
367  goto bitmap_end;
368  }
369  memcpy(pal, colormap, AVPALETTE_SIZE);
370  break;
371  case 4:
372  st->codec->pix_fmt = AV_PIX_FMT_RGB555;
373  break;
374  case 5:
375  st->codec->pix_fmt = alpha_bmp ? AV_PIX_FMT_ARGB : AV_PIX_FMT_0RGB;
376  break;
377  default:
378  av_assert0(0);
379  }
380 
381  if (linesize * height > pkt->size) {
382  res = AVERROR_INVALIDDATA;
383  goto bitmap_end;
384  }
385  memcpy(pkt->data, buf + colormapsize*colormapbpp, linesize * height);
386 
387  res = pkt->size;
388 
389 bitmap_end:
390  av_freep(&zbuf);
391  av_freep(&buf);
392  return res;
393 bitmap_end_skip:
394  av_freep(&zbuf);
395  av_freep(&buf);
396 #else
397  av_log(s, AV_LOG_ERROR, "this file requires zlib support compiled in\n");
398 #endif
399  } else if (tag == TAG_STREAMBLOCK) {
400  for (i = 0; i < s->nb_streams; i++) {
401  st = s->streams[i];
402  if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->id == -1) {
403  if (st->codec->codec_id == AV_CODEC_ID_MP3) {
404  avio_skip(pb, 4);
405  len -= 4;
406  if (len <= 0)
407  goto skip;
408  if ((res = av_get_packet(pb, pkt, len)) < 0)
409  return res;
410  } else { // ADPCM, PCM
411  if (len <= 0)
412  goto skip;
413  if ((res = av_get_packet(pb, pkt, len)) < 0)
414  return res;
415  }
416  pkt->pos = pos;
417  pkt->stream_index = st->index;
418  return pkt->size;
419  }
420  }
421  } else if (tag == TAG_JPEG2) {
422  for (i=0; i<s->nb_streams; i++) {
423  st = s->streams[i];
424  if (st->codec->codec_id == AV_CODEC_ID_MJPEG && st->id == -2)
425  break;
426  }
427  if (i == s->nb_streams) {
428  vst = avformat_new_stream(s, NULL);
429  if (!vst)
430  return AVERROR(ENOMEM);
431  vst->id = -2; /* -2 to avoid clash with video stream and audio stream */
434  avpriv_set_pts_info(vst, 64, 256, swf->frame_rate);
435  st = vst;
436  }
437  avio_rl16(pb); /* BITMAP_ID */
438  len -= 2;
439  if (len < 4)
440  goto skip;
441  if ((res = av_new_packet(pkt, len)) < 0)
442  return res;
443  avio_read(pb, pkt->data, 4);
444  if (AV_RB32(pkt->data) == 0xffd8ffd9 ||
445  AV_RB32(pkt->data) == 0xffd9ffd8) {
446  /* old SWF files containing SOI/EOI as data start */
447  /* files created by swink have reversed tag */
448  pkt->size -= 4;
449  avio_read(pb, pkt->data, pkt->size);
450  } else {
451  avio_read(pb, pkt->data + 4, pkt->size - 4);
452  }
453  pkt->pos = pos;
454  pkt->stream_index = st->index;
455  return pkt->size;
456  } else {
457  av_log(s, AV_LOG_DEBUG, "Unknown tag: %d\n", tag);
458  }
459  skip:
460  if(len<0)
461  av_log(s, AV_LOG_WARNING, "Cliping len %d\n", len);
462  len = FFMAX(0, len);
463  avio_skip(pb, len);
464  }
465 }
466 
467 #if CONFIG_ZLIB
468 static av_cold int swf_read_close(AVFormatContext *avctx)
469 {
470  SWFContext *s = avctx->priv_data;
471  inflateEnd(&s->zstream);
472  av_freep(&s->zbuf_in);
473  av_freep(&s->zbuf_out);
474  av_freep(&s->zpb);
475  return 0;
476 }
477 #endif
478 
480  .name = "swf",
481  .long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash)"),
482  .priv_data_size = sizeof(SWFContext),
486 #if CONFIG_ZLIB
487  .read_close = swf_read_close,
488 #endif
489 };
const AVCodecTag ff_swf_codec_tags[]
Definition: swf.c:25
static int swf_probe(AVProbeData *p)
Definition: swfdec.c:56
float v
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static int get_swf_tag(AVIOContext *pb, int *len_ptr)
Definition: swfdec.c:38
enum AVCodecID id
Definition: mxfenc.c:89
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
misc image utilities
int64_t pos
byte position in stream, -1 if unknown
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
#define AV_RB24
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
#define AV_CH_LAYOUT_STEREO
int ctx_flags
Format-specific flags, see AVFMTCTX_xx.
Definition: avformat.h:980
#define FFALIGN(x, a)
Definition: common.h:63
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
Format I/O context.
Definition: avformat.h:944
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int frame_rate
Definition: swf.h:134
uint8_t
#define av_cold
Definition: attributes.h:78
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:914
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:610
#define AVPALETTE_SIZE
Definition: pixfmt.h:33
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
enum AVStreamParseType need_parsing
Definition: avformat.h:811
int id
Format-specific stream ID.
Definition: avformat.h:650
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
Definition: avformat.h:992
uint8_t * data
uint32_t tag
Definition: movenc.c:894
#define AVERROR_EOF
End of file.
Definition: error.h:55
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
frame
Definition: stft.m:14
#define U(x)
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:73
AVIOContext * avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Allocate and initialize an AVIOContext for buffered I/O.
Definition: aviobuf.c:109
Definition: swf.h:62
AVInputFormat ff_swf_demuxer
Definition: swfdec.c:479
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:579
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
preferred ID for decoding MPEG audio layer 1, 2 or 3
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
#define CONFIG_ZLIB
Definition: config.h:351
#define FFMAX(a, b)
Definition: common.h:56
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:96
uint64_t channel_layout
Audio channel layout.
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
unsigned int nb_streams
A list of all streams in the file.
Definition: avformat.h:991
int samples_per_frame
Definition: swf.h:130
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:231
MIPS optimizations info
Definition: mips.txt:2
struct SWFContext SWFContext
audio channel layout utility functions
static const AVCodecTag swf_audio_codec_tags[]
Definition: swfdec.c:29
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
int width
picture width / height.
static AVStream * create_new_audio_stream(AVFormatContext *s, int id, int info)
Definition: swfdec.c:141
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
static int swf_read_header(AVFormatContext *s)
Definition: swfdec.c:99
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
enum AVMediaType codec_type
enum AVCodecID codec_id
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
synthesis window for stochastic i
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define AVPALETTE_COUNT
Definition: pixfmt.h:34
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: swfdec.c:167
full parsing and repack
Definition: avformat.h:582
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:563
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
#define AV_PIX_FMT_RGB555
Definition: pixfmt.h:269
#define MKBETAG(a, b, c, d)
Definition: common.h:283
int len
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
#define AV_LOG_INFO
Definition: log.h:156
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
Definition: avpacket.c:264
#define AV_CH_LAYOUT_MONO
packed RGB 8:8:8, 32bpp, 0RGB0RGB...
Definition: pixfmt.h:214
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...