FFmpeg  4.4.7
flashsv.c
Go to the documentation of this file.
1 /*
2  * Flash Screen Video decoder
3  * Copyright (C) 2004 Alex Beregszaszi
4  * Copyright (C) 2006 Benjamin Larsson
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 /**
24  * @file
25  * Flash Screen Video decoder
26  * @author Alex Beregszaszi
27  * @author Benjamin Larsson
28  * @author Daniel Verkamp
29  * @author Konstantin Shishkov
30  *
31  * A description of the bitstream format for Flash Screen Video version 1/2
32  * is part of the SWF File Format Specification (version 10), which can be
33  * downloaded from http://www.adobe.com/devnet/swf.html.
34  */
35 
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <zlib.h>
39 
40 #include "libavutil/intreadwrite.h"
41 #include "avcodec.h"
42 #include "bytestream.h"
43 #include "get_bits.h"
44 #include "internal.h"
45 
46 typedef struct BlockInfo {
48  int size;
49 } BlockInfo;
50 
51 typedef struct FlashSVContext {
58  z_stream zstream;
59  int ver;
60  const uint32_t *pal;
71 
72 static int decode_hybrid(const uint8_t *sptr, const uint8_t *sptr_end, uint8_t *dptr, int dx, int dy,
73  int h, int w, int stride, const uint32_t *pal)
74 {
75  int x, y;
76  const uint8_t *orig_src = sptr;
77 
78  for (y = dx + h; y > dx; y--) {
79  uint8_t *dst = dptr + (y * stride) + dy * 3;
80  for (x = 0; x < w; x++) {
81  if (sptr >= sptr_end)
82  return AVERROR_INVALIDDATA;
83  if (*sptr & 0x80) {
84  /* 15-bit color */
85  unsigned c = AV_RB16(sptr) & ~0x8000;
86  unsigned b = c & 0x1F;
87  unsigned g = (c >> 5) & 0x1F;
88  unsigned r = c >> 10;
89  /* 000aaabb -> aaabbaaa */
90  *dst++ = (b << 3) | (b >> 2);
91  *dst++ = (g << 3) | (g >> 2);
92  *dst++ = (r << 3) | (r >> 2);
93  sptr += 2;
94  } else {
95  /* palette index */
96  uint32_t c = pal[*sptr++];
97  bytestream_put_le24(&dst, c);
98  }
99  }
100  }
101  return sptr - orig_src;
102 }
103 
105 {
106  FlashSVContext *s = avctx->priv_data;
107  inflateEnd(&s->zstream);
108  /* release the frame if needed */
109  av_frame_free(&s->frame);
110 
111  /* free the tmpblock */
112  av_freep(&s->tmpblock);
113 
114  return 0;
115 }
116 
118 {
119  FlashSVContext *s = avctx->priv_data;
120  int zret; // Zlib return code
121 
122  s->avctx = avctx;
123  s->zstream.zalloc = Z_NULL;
124  s->zstream.zfree = Z_NULL;
125  s->zstream.opaque = Z_NULL;
126  zret = inflateInit(&s->zstream);
127  if (zret != Z_OK) {
128  av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
129  return 1;
130  }
131  avctx->pix_fmt = AV_PIX_FMT_BGR24;
132 
133  s->frame = av_frame_alloc();
134  if (!s->frame) {
135  return AVERROR(ENOMEM);
136  }
137 
138  return 0;
139 }
140 
142 {
143  z_stream zs;
144  int zret; // Zlib return code
145 
146  if (!src)
147  return AVERROR_INVALIDDATA;
148 
149  zs.zalloc = NULL;
150  zs.zfree = NULL;
151  zs.opaque = NULL;
152 
153  s->zstream.next_in = src;
154  s->zstream.avail_in = size;
155  s->zstream.next_out = s->tmpblock;
156  s->zstream.avail_out = s->block_size * 3;
157  inflate(&s->zstream, Z_SYNC_FLUSH);
158 
159  if (deflateInit(&zs, 0) != Z_OK)
160  return -1;
161  zs.next_in = s->tmpblock;
162  zs.avail_in = s->block_size * 3 - s->zstream.avail_out;
163  zs.next_out = s->deflate_block;
164  zs.avail_out = s->deflate_block_size;
165  deflate(&zs, Z_SYNC_FLUSH);
166  deflateEnd(&zs);
167 
168  if ((zret = inflateReset(&s->zstream)) != Z_OK) {
169  av_log(s->avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret);
170  return AVERROR_UNKNOWN;
171  }
172 
173  s->zstream.next_in = s->deflate_block;
174  s->zstream.avail_in = s->deflate_block_size - zs.avail_out;
175  s->zstream.next_out = s->tmpblock;
176  s->zstream.avail_out = s->block_size * 3;
177  inflate(&s->zstream, Z_SYNC_FLUSH);
178 
179  return 0;
180 }
181 
182 static int flashsv_decode_block(AVCodecContext *avctx, const AVPacket *avpkt,
183  GetBitContext *gb, int block_size,
184  int width, int height, int x_pos, int y_pos,
185  int blk_idx)
186 {
187  struct FlashSVContext *s = avctx->priv_data;
188  uint8_t *line = s->tmpblock;
189  int k;
190  int ret = inflateReset(&s->zstream);
191  if (ret != Z_OK) {
192  av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", ret);
193  return AVERROR_UNKNOWN;
194  }
195  if (s->zlibprime_curr || s->zlibprime_prev) {
196  ret = flashsv2_prime(s,
197  s->blocks[blk_idx].pos,
198  s->blocks[blk_idx].size);
199  if (ret < 0)
200  return ret;
201  }
202  s->zstream.next_in = avpkt->data + get_bits_count(gb) / 8;
203  s->zstream.avail_in = block_size;
204  s->zstream.next_out = s->tmpblock;
205  s->zstream.avail_out = s->block_size * 3;
206  ret = inflate(&s->zstream, Z_FINISH);
207  if (ret == Z_DATA_ERROR) {
208  av_log(avctx, AV_LOG_ERROR, "Zlib resync occurred\n");
209  inflateSync(&s->zstream);
210  ret = inflate(&s->zstream, Z_FINISH);
211  }
212 
213  if (ret != Z_OK && ret != Z_STREAM_END) {
214  //return -1;
215  }
216 
217  if (s->is_keyframe) {
218  s->blocks[blk_idx].pos = s->keyframedata + (get_bits_count(gb) / 8);
219  s->blocks[blk_idx].size = block_size;
220  }
221 
222  y_pos += s->diff_start;
223 
224  if (!s->color_depth) {
225  /* Flash Screen Video stores the image upside down, so copy
226  * lines to destination in reverse order. */
227  for (k = 1; k <= s->diff_height; k++) {
228  memcpy(s->frame->data[0] + x_pos * 3 +
229  (s->image_height - y_pos - k) * s->frame->linesize[0],
230  line, width * 3);
231  /* advance source pointer to next line */
232  line += width * 3;
233  }
234  } else {
235  /* hybrid 15-bit/palette mode */
236  ret = decode_hybrid(s->tmpblock, s->zstream.next_out,
237  s->frame->data[0],
238  s->image_height - (y_pos + 1 + s->diff_height),
239  x_pos, s->diff_height, width,
240  s->frame->linesize[0], s->pal);
241  if (ret < 0) {
242  av_log(avctx, AV_LOG_ERROR, "decode_hybrid failed\n");
243  return ret;
244  }
245  }
246  skip_bits_long(gb, 8 * block_size); /* skip the consumed bits */
247  return 0;
248 }
249 
250 static int calc_deflate_block_size(int tmpblock_size)
251 {
252  z_stream zstream;
253  int size;
254 
255  zstream.zalloc = Z_NULL;
256  zstream.zfree = Z_NULL;
257  zstream.opaque = Z_NULL;
258  if (deflateInit(&zstream, 0) != Z_OK)
259  return -1;
260  size = deflateBound(&zstream, tmpblock_size);
261  deflateEnd(&zstream);
262 
263  return size;
264 }
265 
267  int *got_frame, AVPacket *avpkt)
268 {
269  int buf_size = avpkt->size;
271  int h_blocks, v_blocks, h_part, v_part, i, j, ret;
272  GetBitContext gb;
273  int last_blockwidth = s->block_width;
274  int last_blockheight= s->block_height;
275 
276  /* no supplementary picture */
277  if (buf_size == 0)
278  return 0;
279  if (buf_size < 4)
280  return -1;
281 
282  if ((ret = init_get_bits8(&gb, avpkt->data, buf_size)) < 0)
283  return ret;
284 
285  /* start to parse the bitstream */
286  s->block_width = 16 * (get_bits(&gb, 4) + 1);
287  s->image_width = get_bits(&gb, 12);
288  s->block_height = 16 * (get_bits(&gb, 4) + 1);
289  s->image_height = get_bits(&gb, 12);
290 
291  if ( last_blockwidth != s->block_width
292  || last_blockheight!= s->block_height)
293  av_freep(&s->blocks);
294 
295  if (s->ver == 2) {
296  skip_bits(&gb, 6);
297  if (get_bits1(&gb)) {
298  avpriv_request_sample(avctx, "iframe");
299  return AVERROR_PATCHWELCOME;
300  }
301  if (get_bits1(&gb)) {
302  avpriv_request_sample(avctx, "Custom palette");
303  return AVERROR_PATCHWELCOME;
304  }
305  }
306 
307  /* calculate number of blocks and size of border (partial) blocks */
308  h_blocks = s->image_width / s->block_width;
309  h_part = s->image_width % s->block_width;
310  v_blocks = s->image_height / s->block_height;
311  v_part = s->image_height % s->block_height;
312 
313  if (h_blocks * v_blocks * 16 > get_bits_left(&gb))
314  return AVERROR_INVALIDDATA;
315 
316  /* the block size could change between frames, make sure the buffer
317  * is large enough, if not, get a larger one */
318  if (s->block_size < s->block_width * s->block_height) {
319  int tmpblock_size = 3 * s->block_width * s->block_height, err;
320 
321  if ((err = av_reallocp(&s->tmpblock, tmpblock_size)) < 0) {
322  s->block_size = 0;
324  "Cannot allocate decompression buffer.\n");
325  return err;
326  }
327  if (s->ver == 2) {
328  s->deflate_block_size = calc_deflate_block_size(tmpblock_size);
329  if (s->deflate_block_size <= 0) {
331  "Cannot determine deflate buffer size.\n");
332  return -1;
333  }
334  if ((err = av_reallocp(&s->deflate_block, s->deflate_block_size)) < 0) {
335  s->block_size = 0;
336  av_log(avctx, AV_LOG_ERROR, "Cannot allocate deflate buffer.\n");
337  return err;
338  }
339  }
340  }
341  s->block_size = s->block_width * s->block_height;
342 
343  /* initialize the image size once */
344  if (avctx->width == 0 && avctx->height == 0) {
345  if ((ret = ff_set_dimensions(avctx, s->image_width, s->image_height)) < 0)
346  return ret;
347  }
348 
349  /* check for changes of image width and image height */
350  if (avctx->width != s->image_width || avctx->height != s->image_height) {
352  "Frame width or height differs from first frame!\n");
353  av_log(avctx, AV_LOG_ERROR, "fh = %d, fv %d vs ch = %d, cv = %d\n",
354  avctx->height, avctx->width, s->image_height, s->image_width);
355  return AVERROR_INVALIDDATA;
356  }
357 
358  /* we care for keyframes only in Screen Video v2 */
359  s->is_keyframe = (avpkt->flags & AV_PKT_FLAG_KEY) && (s->ver == 2);
360  if (s->is_keyframe) {
361  int err;
362  if ((err = av_reallocp(&s->keyframedata, avpkt->size)) < 0)
363  return err;
364  memcpy(s->keyframedata, avpkt->data, avpkt->size);
365  }
366  if(s->ver == 2 && !s->blocks)
367  s->blocks = av_mallocz((v_blocks + !!v_part) * (h_blocks + !!h_part) *
368  sizeof(s->blocks[0]));
369 
370  ff_dlog(avctx, "image: %dx%d block: %dx%d num: %dx%d part: %dx%d\n",
371  s->image_width, s->image_height, s->block_width, s->block_height,
372  h_blocks, v_blocks, h_part, v_part);
373 
374  if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
375  return ret;
376 
377  /* loop over all block columns */
378  for (j = 0; j < v_blocks + (v_part ? 1 : 0); j++) {
379 
380  int y_pos = j * s->block_height; // vertical position in frame
381  int cur_blk_height = (j < v_blocks) ? s->block_height : v_part;
382 
383  /* loop over all block rows */
384  for (i = 0; i < h_blocks + (h_part ? 1 : 0); i++) {
385  int x_pos = i * s->block_width; // horizontal position in frame
386  int cur_blk_width = (i < h_blocks) ? s->block_width : h_part;
387  int has_diff = 0;
388 
389  /* get the size of the compressed zlib chunk */
390  int size = get_bits(&gb, 16);
391 
392  s->color_depth = 0;
393  s->zlibprime_curr = 0;
394  s->zlibprime_prev = 0;
395  s->diff_start = 0;
396  s->diff_height = cur_blk_height;
397 
398  if (8 * size > get_bits_left(&gb)) {
399  av_frame_unref(s->frame);
400  return AVERROR_INVALIDDATA;
401  }
402 
403  if (s->ver == 2 && size) {
404  skip_bits(&gb, 3);
405  s->color_depth = get_bits(&gb, 2);
406  has_diff = get_bits1(&gb);
407  s->zlibprime_curr = get_bits1(&gb);
408  s->zlibprime_prev = get_bits1(&gb);
409 
410  if (s->color_depth != 0 && s->color_depth != 2) {
412  "%dx%d invalid color depth %d\n",
413  i, j, s->color_depth);
414  return AVERROR_INVALIDDATA;
415  }
416 
417  if (has_diff) {
418  if (size < 3) {
419  av_log(avctx, AV_LOG_ERROR, "size too small for diff\n");
420  return AVERROR_INVALIDDATA;
421  }
422  if (!s->keyframe) {
424  "Inter frame without keyframe\n");
425  return AVERROR_INVALIDDATA;
426  }
427  s->diff_start = get_bits(&gb, 8);
428  s->diff_height = get_bits(&gb, 8);
429  if (s->diff_start + s->diff_height > cur_blk_height) {
431  "Block parameters invalid: %d + %d > %d\n",
432  s->diff_start, s->diff_height, cur_blk_height);
433  return AVERROR_INVALIDDATA;
434  }
436  "%dx%d diff start %d height %d\n",
437  i, j, s->diff_start, s->diff_height);
438  size -= 2;
439  }
440 
441  if (s->zlibprime_prev)
442  av_log(avctx, AV_LOG_DEBUG, "%dx%d zlibprime_prev\n", i, j);
443 
444  if (s->zlibprime_curr) {
445  int col = get_bits(&gb, 8);
446  int row = get_bits(&gb, 8);
447  av_log(avctx, AV_LOG_DEBUG, "%dx%d zlibprime_curr %dx%d\n",
448  i, j, col, row);
449  if (size < 3) {
450  av_log(avctx, AV_LOG_ERROR, "size too small for zlibprime_curr\n");
451  return AVERROR_INVALIDDATA;
452  }
453  size -= 2;
454  avpriv_request_sample(avctx, "zlibprime_curr");
455  return AVERROR_PATCHWELCOME;
456  }
457  if (!s->blocks && (s->zlibprime_curr || s->zlibprime_prev)) {
459  "no data available for zlib priming\n");
460  return AVERROR_INVALIDDATA;
461  }
462  size--; // account for flags byte
463  }
464 
465  if (has_diff) {
466  int k;
467  int off = (s->image_height - y_pos - 1) * s->frame->linesize[0];
468 
469  for (k = 0; k < cur_blk_height; k++) {
470  int x = off - k * s->frame->linesize[0] + x_pos * 3;
471  memcpy(s->frame->data[0] + x, s->keyframe + x,
472  cur_blk_width * 3);
473  }
474  }
475 
476  /* skip unchanged blocks, which have size 0 */
477  if (size) {
478  if (flashsv_decode_block(avctx, avpkt, &gb, size,
479  cur_blk_width, cur_blk_height,
480  x_pos, y_pos,
481  i + j * (h_blocks + !!h_part)))
483  "error in decompression of block %dx%d\n", i, j);
484  }
485  }
486  }
487  if (s->is_keyframe && s->ver == 2) {
488  if (!s->keyframe) {
489  s->keyframe = av_malloc(s->frame->linesize[0] * avctx->height);
490  if (!s->keyframe) {
491  av_log(avctx, AV_LOG_ERROR, "Cannot allocate image data\n");
492  return AVERROR(ENOMEM);
493  }
494  }
495  memcpy(s->keyframe, s->frame->data[0],
496  s->frame->linesize[0] * avctx->height);
497  }
498 
499  if ((ret = av_frame_ref(data, s->frame)) < 0)
500  return ret;
501 
502  *got_frame = 1;
503 
504  if ((get_bits_count(&gb) / 8) != buf_size)
505  av_log(avctx, AV_LOG_ERROR, "buffer not fully consumed (%d != %d)\n",
506  buf_size, (get_bits_count(&gb) / 8));
507 
508  /* report that the buffer was completely consumed */
509  return buf_size;
510 }
511 
512 #if CONFIG_FLASHSV_DECODER
514  .name = "flashsv",
515  .long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video v1"),
516  .type = AVMEDIA_TYPE_VIDEO,
517  .id = AV_CODEC_ID_FLASHSV,
518  .priv_data_size = sizeof(FlashSVContext),
520  .close = flashsv_decode_end,
522  .capabilities = AV_CODEC_CAP_DR1,
523  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
525 };
526 #endif /* CONFIG_FLASHSV_DECODER */
527 
528 #if CONFIG_FLASHSV2_DECODER
529 static const uint32_t ff_flashsv2_default_palette[128] = {
530  0x000000, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF,
531  0x330000, 0x660000, 0x990000, 0xCC0000, 0xFF0000, 0x003300,
532  0x006600, 0x009900, 0x00CC00, 0x00FF00, 0x000033, 0x000066,
533  0x000099, 0x0000CC, 0x0000FF, 0x333300, 0x666600, 0x999900,
534  0xCCCC00, 0xFFFF00, 0x003333, 0x006666, 0x009999, 0x00CCCC,
535  0x00FFFF, 0x330033, 0x660066, 0x990099, 0xCC00CC, 0xFF00FF,
536  0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFF33FF, 0xFF66FF,
537  0xFF99FF, 0xFFCCFF, 0x33FFFF, 0x66FFFF, 0x99FFFF, 0xCCFFFF,
538  0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCFF, 0xCC33CC, 0xCC66CC,
539  0xCC99CC, 0xCCFFCC, 0x33CCCC, 0x66CCCC, 0x99CCCC, 0xFFCCCC,
540  0x999933, 0x999966, 0x9999CC, 0x9999FF, 0x993399, 0x996699,
541  0x99CC99, 0x99FF99, 0x339999, 0x669999, 0xCC9999, 0xFF9999,
542  0x666633, 0x666699, 0x6666CC, 0x6666FF, 0x663366, 0x669966,
543  0x66CC66, 0x66FF66, 0x336666, 0x996666, 0xCC6666, 0xFF6666,
544  0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336633, 0x339933,
545  0x33CC33, 0x33FF33, 0x663333, 0x993333, 0xCC3333, 0xFF3333,
546  0x003366, 0x336600, 0x660033, 0x006633, 0x330066, 0x663300,
547  0x336699, 0x669933, 0x993366, 0x339966, 0x663399, 0x996633,
548  0x6699CC, 0x99CC66, 0xCC6699, 0x66CC99, 0x9966CC, 0xCC9966,
549  0x99CCFF, 0xCCFF99, 0xFF99CC, 0x99FFCC, 0xCC99FF, 0xFFCC99,
550  0x111111, 0x222222, 0x444444, 0x555555, 0xAAAAAA, 0xBBBBBB,
551  0xDDDDDD, 0xEEEEEE
552 };
553 
554 static av_cold int flashsv2_decode_init(AVCodecContext *avctx)
555 {
557  int ret;
558 
559  ret = flashsv_decode_init(avctx);
560  if (ret < 0)
561  return ret;
562  s->pal = ff_flashsv2_default_palette;
563  s->ver = 2;
564 
565  return 0;
566 }
567 
568 static av_cold int flashsv2_decode_end(AVCodecContext *avctx)
569 {
571 
572  av_freep(&s->keyframedata);
573  av_freep(&s->blocks);
574  av_freep(&s->keyframe);
575  av_freep(&s->deflate_block);
577 
578  return 0;
579 }
580 
582  .name = "flashsv2",
583  .long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video v2"),
584  .type = AVMEDIA_TYPE_VIDEO,
585  .id = AV_CODEC_ID_FLASHSV2,
586  .priv_data_size = sizeof(FlashSVContext),
587  .init = flashsv2_decode_init,
588  .close = flashsv2_decode_end,
590  .capabilities = AV_CODEC_CAP_DR1,
591  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
593 };
594 #endif /* CONFIG_FLASHSV2_DECODER */
AVCodec ff_flashsv2_decoder
AVCodec ff_flashsv_decoder
#define av_cold
Definition: attributes.h:88
uint8_t
Libavcodec external API header.
#define AV_RB16
Definition: intreadwrite.h:53
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
#define s(width, name)
Definition: cbs_vp9.c:257
#define NULL
Definition: coverity.c:32
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
Definition: decode.c:2007
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
static int calc_deflate_block_size(int tmpblock_size)
Definition: flashsv.c:250
static int flashsv_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: flashsv.c:266
static av_cold int flashsv_decode_end(AVCodecContext *avctx)
Definition: flashsv.c:104
static av_cold int flashsv_decode_init(AVCodecContext *avctx)
Definition: flashsv.c:117
static int flashsv_decode_block(AVCodecContext *avctx, const AVPacket *avpkt, GetBitContext *gb, int block_size, int width, int height, int x_pos, int y_pos, int blk_idx)
Definition: flashsv.c:182
static int flashsv2_prime(FlashSVContext *s, uint8_t *src, int size)
Definition: flashsv.c:141
static int decode_hybrid(const uint8_t *sptr, const uint8_t *sptr_end, uint8_t *dptr, int dx, int dy, int h, int w, int stride, const uint32_t *pal)
Definition: flashsv.c:72
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
@ AV_CODEC_ID_FLASHSV2
Definition: codec_id.h:180
@ AV_CODEC_ID_FLASHSV
Definition: codec_id.h:135
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:410
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:71
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define AVERROR(e)
Definition: error.h:43
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:553
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:443
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:203
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:190
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition: mem.c:161
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
for(j=16;j >0;--j)
int i
Definition: input.c:407
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: internal.h:49
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:84
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:309
uint8_t w
Definition: llviddspenc.c:39
int stride
Definition: mace.c:144
const char data[16]
Definition: mxf.c:142
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
main external API structure.
Definition: avcodec.h:536
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:746
int width
picture width / height.
Definition: avcodec.h:709
void * priv_data
Definition: avcodec.h:563
AVCodec.
Definition: codec.h:197
const char * name
Name of the codec implementation.
Definition: codec.h:204
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
This structure stores compressed data.
Definition: packet.h:346
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:375
int size
Definition: packet.h:370
uint8_t * data
Definition: packet.h:369
int size
Definition: flashsv.c:48
uint8_t * pos
Definition: flashsv.c:47
uint8_t * deflate_block
Definition: flashsv.c:65
uint8_t * keyframedata
Definition: flashsv.c:62
const uint32_t * pal
Definition: flashsv.c:60
AVFrame * frame
Definition: flashsv.c:53
z_stream zstream
Definition: flashsv.c:58
int block_height
Definition: flashsv.c:55
int color_depth
Definition: flashsv.c:67
uint8_t * tmpblock
Definition: flashsv.c:56
int image_height
Definition: flashsv.c:54
int zlibprime_curr
Definition: flashsv.c:68
int block_width
Definition: flashsv.c:55
int diff_height
Definition: flashsv.c:69
int image_width
Definition: flashsv.c:54
AVCodecContext * avctx
Definition: flashsv.c:52
int is_keyframe
Definition: flashsv.c:61
int zlibprime_prev
Definition: flashsv.c:68
uint8_t * keyframe
Definition: flashsv.c:63
int block_size
Definition: flashsv.c:57
BlockInfo * blocks
Definition: flashsv.c:64
int diff_start
Definition: flashsv.c:69
int deflate_block_size
Definition: flashsv.c:66
Definition: graph2dot.c:48
#define ff_dlog(a,...)
#define avpriv_request_sample(...)
#define av_freep(p)
#define av_malloc(s)
#define av_log(a,...)
#define src
Definition: vp8dsp.c:255
#define height
#define width
int size
const char * b
Definition: vf_curves.c:118
const char * g
Definition: vf_curves.c:117
const char * r
Definition: vf_curves.c:116
static void deflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
Definition: vf_neighbor.c:165
static void inflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
Definition: vf_neighbor.c:198
static double c[64]