FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
wmv2dec.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002 The FFmpeg Project
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/mem_internal.h"
22 
23 #include "avcodec.h"
24 #include "codec_internal.h"
25 #include "h263dec.h"
26 #include "intrax8.h"
27 #include "mathops.h"
28 #include "mpegutils.h"
29 #include "mpegvideo.h"
30 #include "mpegvideodec.h"
31 #include "msmpeg4.h"
32 #include "msmpeg4_vc1_data.h"
33 #include "msmpeg4dec.h"
34 #include "simple_idct.h"
35 #include "wmv2.h"
36 #include "wmv2data.h"
37 #include "wmv2dec.h"
38 
39 typedef struct WMV2DecContext {
44  int j_type;
45  int abt_flag;
46  int abt_type;
50  int mspel_bit;
54  int skip_type;
55 
56  DECLARE_ALIGNED(32, int16_t, abt_block2)[6][64];
58 
59 static void wmv2_add_block(WMV2DecContext *w, int16_t blocks1[][64],
60  uint8_t *dst, int stride, int n)
61 {
62  H263DecContext *const h = &w->ms.h;
63 
64  if (h->c.block_last_index[n] >= 0) {
65  int16_t *block1 = blocks1[n];
66  switch (w->abt_type_table[n]) {
67  case 0:
68  w->common.wdsp.idct_add(dst, stride, block1);
69  break;
70  case 1:
72  ff_simple_idct84_add(dst + 4 * stride, stride, w->abt_block2[n]);
73  h->c.bdsp.clear_block(w->abt_block2[n]);
74  break;
75  case 2:
77  ff_simple_idct48_add(dst + 4, stride, w->abt_block2[n]);
78  h->c.bdsp.clear_block(w->abt_block2[n]);
79  break;
80  default:
81  av_log(h->c.avctx, AV_LOG_ERROR, "internal error in WMV2 abt\n");
82  }
83  }
84 }
85 
86 void ff_wmv2_add_mb(MpegEncContext *s, int16_t block1[6][64],
87  uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr)
88 {
89  WMV2DecContext *const w = (WMV2DecContext *) s;
90 
91  wmv2_add_block(w, block1, dest_y, s->linesize, 0);
92  wmv2_add_block(w, block1, dest_y + 8, s->linesize, 1);
93  wmv2_add_block(w, block1, dest_y + 8 * s->linesize, s->linesize, 2);
94  wmv2_add_block(w, block1, dest_y + 8 + 8 * s->linesize, s->linesize, 3);
95 
96  if (s->avctx->flags & AV_CODEC_FLAG_GRAY)
97  return;
98 
99  wmv2_add_block(w, block1, dest_cb, s->uvlinesize, 4);
100  wmv2_add_block(w, block1, dest_cr, s->uvlinesize, 5);
101 }
102 
104 {
105  H263DecContext *const h = &w->ms.h;
106  int coded_mb_count = 0;
107  uint32_t *const mb_type = h->c.cur_pic.mb_type;
108 
109  w->skip_type = get_bits(&h->gb, 2);
110  switch (w->skip_type) {
111  case SKIP_TYPE_NONE:
112  for (int mb_y = 0; mb_y < h->c.mb_height; mb_y++)
113  for (int mb_x = 0; mb_x < h->c.mb_width; mb_x++)
114  mb_type[mb_y * h->c.mb_stride + mb_x] =
116  break;
117  case SKIP_TYPE_MPEG:
118  if (get_bits_left(&h->gb) < h->c.mb_height * h->c.mb_width)
119  return AVERROR_INVALIDDATA;
120  for (int mb_y = 0; mb_y < h->c.mb_height; mb_y++)
121  for (int mb_x = 0; mb_x < h->c.mb_width; mb_x++)
122  mb_type[mb_y * h->c.mb_stride + mb_x] =
124  break;
125  case SKIP_TYPE_ROW:
126  for (int mb_y = 0; mb_y < h->c.mb_height; mb_y++) {
127  if (get_bits_left(&h->gb) < 1)
128  return AVERROR_INVALIDDATA;
129  if (get_bits1(&h->gb)) {
130  for (int mb_x = 0; mb_x < h->c.mb_width; mb_x++)
131  mb_type[mb_y * h->c.mb_stride + mb_x] =
133  } else {
134  for (int mb_x = 0; mb_x < h->c.mb_width; mb_x++)
135  mb_type[mb_y * h->c.mb_stride + mb_x] =
137  }
138  }
139  break;
140  case SKIP_TYPE_COL:
141  for (int mb_x = 0; mb_x < h->c.mb_width; mb_x++) {
142  if (get_bits_left(&h->gb) < 1)
143  return AVERROR_INVALIDDATA;
144  if (get_bits1(&h->gb)) {
145  for (int mb_y = 0; mb_y < h->c.mb_height; mb_y++)
146  mb_type[mb_y * h->c.mb_stride + mb_x] =
148  } else {
149  for (int mb_y = 0; mb_y < h->c.mb_height; mb_y++)
150  mb_type[mb_y * h->c.mb_stride + mb_x] =
152  }
153  }
154  break;
155  }
156 
157  for (int mb_y = 0; mb_y < h->c.mb_height; mb_y++)
158  for (int mb_x = 0; mb_x < h->c.mb_width; mb_x++)
159  coded_mb_count += !IS_SKIP(mb_type[mb_y * h->c.mb_stride + mb_x]);
160 
161  if (coded_mb_count > get_bits_left(&h->gb))
162  return AVERROR_INVALIDDATA;
163 
164  return 0;
165 }
166 
168 {
169  H263DecContext *const h = &w->ms.h;
170  GetBitContext gb;
171  int fps;
172  int code;
173 
174  if (h->c.avctx->extradata_size < 4)
175  return AVERROR_INVALIDDATA;
176 
177  init_get_bits(&gb, h->c.avctx->extradata, 32);
178 
179  fps = get_bits(&gb, 5);
180  w->ms.bit_rate = get_bits(&gb, 11) * 1024;
181  w->mspel_bit = get_bits1(&gb);
182  h->loop_filter = get_bits1(&gb);
183  w->abt_flag = get_bits1(&gb);
184  w->j_type_bit = get_bits1(&gb);
185  w->top_left_mv_flag = get_bits1(&gb);
186  w->per_mb_rl_bit = get_bits1(&gb);
187  code = get_bits(&gb, 3);
188 
189  if (code == 0)
190  return AVERROR_INVALIDDATA;
191 
192  h->slice_height = h->c.mb_height / code;
193 
194  if (h->c.avctx->debug & FF_DEBUG_PICT_INFO)
195  av_log(h->c.avctx, AV_LOG_DEBUG,
196  "fps:%d, br:%d, qpbit:%d, abt_flag:%d, j_type_bit:%d, "
197  "tl_mv_flag:%d, mbrl_bit:%d, code:%d, loop_filter:%d, "
198  "slices:%d\n",
199  fps, w->ms.bit_rate, w->mspel_bit, w->abt_flag, w->j_type_bit,
200  w->top_left_mv_flag, w->per_mb_rl_bit, code, h->loop_filter,
201  code);
202  return 0;
203 }
204 
206 {
207  int code;
208 
209  h->c.pict_type = get_bits1(&h->gb) + 1;
210  if (h->c.pict_type == AV_PICTURE_TYPE_I) {
211  code = get_bits(&h->gb, 7);
212  av_log(h->c.avctx, AV_LOG_DEBUG, "I7:%X/\n", code);
213  }
214  h->c.chroma_qscale = h->c.qscale = get_bits(&h->gb, 5);
215  if (h->c.qscale <= 0)
216  return AVERROR_INVALIDDATA;
217 
218  if (h->c.pict_type != AV_PICTURE_TYPE_I && show_bits(&h->gb, 1)) {
219  GetBitContext gb = h->gb;
220  int skip_type = get_bits(&gb, 2);
221  int run = skip_type == SKIP_TYPE_COL ? h->c.mb_width : h->c.mb_height;
222 
223  while (run > 0) {
224  int block = FFMIN(run, 25);
225  if (get_bits(&gb, block) + 1 != 1<<block)
226  break;
227  run -= block;
228  }
229  if (!run)
230  return FRAME_SKIPPED;
231  }
232 
233  return 0;
234 }
235 
237 {
238  WMV2DecContext *const w = (WMV2DecContext *)h;
239 
240  if (h->c.pict_type == AV_PICTURE_TYPE_I) {
241  /* Is filling with zeroes really the right thing to do? */
242  memset(h->c.cur_pic.mb_type, 0,
243  sizeof(*h->c.cur_pic.mb_type) * h->c.mb_height * h->c.mb_stride);
244  if (w->j_type_bit)
245  w->j_type = get_bits1(&h->gb);
246  else
247  w->j_type = 0; // FIXME check
248 
249  if (!w->j_type) {
250  if (w->per_mb_rl_bit)
251  w->ms.per_mb_rl_table = get_bits1(&h->gb);
252  else
253  w->ms.per_mb_rl_table = 0;
254 
255  if (!w->ms.per_mb_rl_table) {
256  w->ms.rl_chroma_table_index = decode012(&h->gb);
257  w->ms.rl_table_index = decode012(&h->gb);
258  }
259 
260  w->ms.dc_table_index = get_bits1(&h->gb);
261 
262  // at minimum one bit per macroblock is required at least in a valid frame,
263  // we discard frames much smaller than this. Frames smaller than 1/8 of the
264  // smallest "black/skip" frame generally contain not much recoverable content
265  // while at the same time they have the highest computational requirements
266  // per byte
267  if (get_bits_left(&h->gb) * 8LL < (h->c.width+15)/16 * ((h->c.height+15)/16))
268  return AVERROR_INVALIDDATA;
269  }
270  h->c.inter_intra_pred = 0;
271  h->c.no_rounding = 1;
272  if (h->c.avctx->debug & FF_DEBUG_PICT_INFO) {
273  av_log(h->c.avctx, AV_LOG_DEBUG,
274  "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n",
275  h->c.qscale, w->ms.rl_chroma_table_index, w->ms.rl_table_index,
276  w->ms.dc_table_index, w->ms.per_mb_rl_table, w->j_type);
277  }
278  } else {
279  int cbp_index;
280  int ret;
281  w->j_type = 0;
282 
283  ret = parse_mb_skip(w);
284  if (ret < 0)
285  return ret;
286  cbp_index = decode012(&h->gb);
287  w->cbp_table_index = wmv2_get_cbp_table_index(h->c.qscale, cbp_index);
288 
289  if (w->mspel_bit)
290  h->c.mspel = get_bits1(&h->gb);
291  else
292  h->c.mspel = 0; // FIXME check
293 
294  if (w->abt_flag) {
295  w->per_mb_abt = get_bits1(&h->gb) ^ 1;
296  if (!w->per_mb_abt)
297  w->abt_type = decode012(&h->gb);
298  }
299 
300  if (w->per_mb_rl_bit)
301  w->ms.per_mb_rl_table = get_bits1(&h->gb);
302  else
303  w->ms.per_mb_rl_table = 0;
304 
305  if (!w->ms.per_mb_rl_table) {
306  w->ms.rl_table_index = decode012(&h->gb);
307  w->ms.rl_chroma_table_index = w->ms.rl_table_index;
308  }
309 
310  if (get_bits_left(&h->gb) < 2)
311  return AVERROR_INVALIDDATA;
312 
313  w->ms.dc_table_index = get_bits1(&h->gb);
314  w->ms.mv_table_index = get_bits1(&h->gb);
315 
316  h->c.inter_intra_pred = 0; // (h->c.width * h->c.height < 320 * 240 && w->ms.bit_rate <= II_BITRATE);
317  h->c.no_rounding ^= 1;
318 
319  if (h->c.avctx->debug & FF_DEBUG_PICT_INFO) {
320  av_log(h->c.avctx, AV_LOG_DEBUG,
321  "rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d "
322  "per_mb_abt:%d abt_type:%d cbp:%d ii:%d\n",
323  w->ms.rl_table_index, w->ms.rl_chroma_table_index,
324  w->ms.dc_table_index, w->ms.mv_table_index,
325  w->ms.per_mb_rl_table, h->c.qscale, h->c.mspel,
326  w->per_mb_abt, w->abt_type, w->cbp_table_index,
327  h->c.inter_intra_pred);
328  }
329  }
330  w->ms.esc3_level_length = 0;
331  w->ms.esc3_run_length = 0;
332 
333  if (w->j_type) {
334  ff_intrax8_decode_picture(&w->x8, h->c.cur_pic.ptr,
335  &h->gb, &h->c.mb_x, &h->c.mb_y,
336  2 * h->c.qscale, (h->c.qscale - 1) | 1,
337  h->loop_filter, h->c.low_delay);
338 
339  ff_er_add_slice(&h->c.er, 0, 0,
340  (h->c.mb_x >> 1) - 1, (h->c.mb_y >> 1) - 1,
341  ER_MB_END);
342  return 1;
343  }
344 
345  return 0;
346 }
347 
348 static inline void wmv2_decode_motion(WMV2DecContext *w, int *mx_ptr, int *my_ptr)
349 {
350  H263DecContext *const h = &w->ms.h;
351 
352  ff_msmpeg4_decode_motion(&w->ms, mx_ptr, my_ptr);
353 
354  if ((((*mx_ptr) | (*my_ptr)) & 1) && h->c.mspel)
355  w->common.hshift = get_bits1(&h->gb);
356  else
357  w->common.hshift = 0;
358 }
359 
360 static int16_t *wmv2_pred_motion(WMV2DecContext *w, int *px, int *py)
361 {
362  H263DecContext *const h = &w->ms.h;
363  int diff, type;
364 
365  int wrap = h->c.b8_stride;
366  int xy = h->c.block_index[0];
367 
368  int16_t *mot_val = h->c.cur_pic.motion_val[0][xy];
369 
370  const int16_t *A = h->c.cur_pic.motion_val[0][xy - 1];
371  const int16_t *B = h->c.cur_pic.motion_val[0][xy - wrap];
372  const int16_t *C = h->c.cur_pic.motion_val[0][xy + 2 - wrap];
373 
374  if (h->c.mb_x && !h->c.first_slice_line && !h->c.mspel && w->top_left_mv_flag)
375  diff = FFMAX(FFABS(A[0] - B[0]), FFABS(A[1] - B[1]));
376  else
377  diff = 0;
378 
379  if (diff >= 8)
380  type = get_bits1(&h->gb);
381  else
382  type = 2;
383 
384  if (type == 0) {
385  *px = A[0];
386  *py = A[1];
387  } else if (type == 1) {
388  *px = B[0];
389  *py = B[1];
390  } else {
391  /* special case for first (slice) line */
392  if (h->c.first_slice_line) {
393  *px = A[0];
394  *py = A[1];
395  } else {
396  *px = mid_pred(A[0], B[0], C[0]);
397  *py = mid_pred(A[1], B[1], C[1]);
398  }
399  }
400 
401  return mot_val;
402 }
403 
404 static inline int wmv2_decode_inter_block(WMV2DecContext *w, int16_t *block,
405  int n, int cbp)
406 {
407  H263DecContext *const h = &w->ms.h;
408  static const int sub_cbp_table[3] = { 2, 3, 1 };
409  int sub_cbp, ret;
410 
411  if (!cbp) {
412  h->c.block_last_index[n] = -1;
413  return 0;
414  }
415 
416  if (w->per_block_abt)
417  w->abt_type = decode012(&h->gb);
418  w->abt_type_table[n] = w->abt_type;
419 
420  if (w->abt_type) {
421  const uint8_t *scantable = w->abt_type == 1 ? ff_wmv2_scantableA : ff_wmv2_scantableB;
422 
423  sub_cbp = sub_cbp_table[decode012(&h->gb)];
424 
425  if (sub_cbp & 1) {
426  ret = ff_msmpeg4_decode_block(&w->ms, block, n, 1, scantable);
427  if (ret < 0)
428  return ret;
429  }
430 
431  if (sub_cbp & 2) {
432  ret = ff_msmpeg4_decode_block(&w->ms, w->abt_block2[n], n, 1, scantable);
433  if (ret < 0)
434  return ret;
435  }
436 
437  h->c.block_last_index[n] = 63;
438 
439  return 0;
440  } else {
441  return ff_msmpeg4_decode_block(&w->ms, block, n, 1,
442  h->c.inter_scantable.permutated);
443  }
444 }
445 
446 static int wmv2_decode_mb(H263DecContext *const h)
447 {
448  /* The following is only allowed because this decoder
449  * does not use slice threading. */
450  WMV2DecContext *const w = (WMV2DecContext *) h;
451  MSMP4DecContext *const ms = &w->ms;
452  int cbp, code, i, ret;
453  uint8_t *coded_val;
454 
455  if (w->j_type)
456  return 0;
457 
458  if (h->c.pict_type == AV_PICTURE_TYPE_P) {
459  if (IS_SKIP(h->c.cur_pic.mb_type[h->c.mb_y * h->c.mb_stride + h->c.mb_x])) {
460  /* skip mb */
461  h->c.mb_intra = 0;
462  for (i = 0; i < 6; i++)
463  h->c.block_last_index[i] = -1;
464  h->c.mv_dir = MV_DIR_FORWARD;
465  h->c.mv_type = MV_TYPE_16X16;
466  h->c.mv[0][0][0] = 0;
467  h->c.mv[0][0][1] = 0;
468  h->c.mb_skipped = 1;
469  w->common.hshift = 0;
470  return 0;
471  }
472  if (get_bits_left(&h->gb) <= 0)
473  return AVERROR_INVALIDDATA;
474 
475  code = get_vlc2(&h->gb, ff_mb_non_intra_vlc[w->cbp_table_index],
477  h->c.mb_intra = (~code & 0x40) >> 6;
478 
479  cbp = code & 0x3f;
480  } else {
481  h->c.mb_intra = 1;
482  if (get_bits_left(&h->gb) <= 0)
483  return AVERROR_INVALIDDATA;
486  /* predict coded block pattern */
487  cbp = 0;
488  for (i = 0; i < 6; i++) {
489  int val = ((code >> (5 - i)) & 1);
490  if (i < 4) {
491  int pred = ff_msmpeg4_coded_block_pred(&h->c, i, &coded_val);
492  val = val ^ pred;
493  *coded_val = val;
494  }
495  cbp |= val << (5 - i);
496  }
497  }
498 
499  if (!h->c.mb_intra) {
500  int mx, my;
501  wmv2_pred_motion(w, &mx, &my);
502 
503  if (cbp) {
504  h->c.bdsp.clear_blocks(h->block[0]);
505  if (ms->per_mb_rl_table) {
506  ms->rl_table_index = decode012(&h->gb);
508  }
509 
510  if (w->abt_flag && w->per_mb_abt) {
511  w->per_block_abt = get_bits1(&h->gb);
512  if (!w->per_block_abt)
513  w->abt_type = decode012(&h->gb);
514  } else
515  w->per_block_abt = 0;
516  }
517 
518  wmv2_decode_motion(w, &mx, &my);
519 
520  h->c.mv_dir = MV_DIR_FORWARD;
521  h->c.mv_type = MV_TYPE_16X16;
522  h->c.mv[0][0][0] = mx;
523  h->c.mv[0][0][1] = my;
524 
525  for (i = 0; i < 6; i++) {
526  if ((ret = wmv2_decode_inter_block(w, h->block[i], i, (cbp >> (5 - i)) & 1)) < 0) {
527  av_log(h->c.avctx, AV_LOG_ERROR,
528  "\nerror while decoding inter block: %d x %d (%d)\n",
529  h->c.mb_x, h->c.mb_y, i);
530  return ret;
531  }
532  }
533  } else {
534  if (h->c.pict_type == AV_PICTURE_TYPE_P)
535  ff_dlog(h->c.avctx, "%d%d ", h->c.inter_intra_pred, cbp);
536  ff_dlog(h->c.avctx, "I at %d %d %d %06X\n", h->c.mb_x, h->c.mb_y,
537  ((cbp & 3) ? 1 : 0) + ((cbp & 0x3C) ? 2 : 0),
538  show_bits(&h->gb, 24));
539  h->c.ac_pred = get_bits1(&h->gb);
540  if (h->c.inter_intra_pred) {
541  h->c.h263_aic_dir = get_vlc2(&h->gb, ff_inter_intra_vlc,
543  ff_dlog(h->c.avctx, "%d%d %d %d/",
544  h->c.ac_pred, h->c.h263_aic_dir, h->c.mb_x, h->c.mb_y);
545  }
546  if (ms->per_mb_rl_table && cbp) {
547  ms->rl_table_index = decode012(&h->gb);
549  }
550 
551  h->c.bdsp.clear_blocks(h->block[0]);
552  for (i = 0; i < 6; i++) {
553  ret = ff_msmpeg4_decode_block(ms, h->block[i], i, (cbp >> (5 - i)) & 1, NULL);
554  if (ret < 0) {
555  av_log(h->c.avctx, AV_LOG_ERROR,
556  "\nerror while decoding intra block: %d x %d (%d)\n",
557  h->c.mb_x, h->c.mb_y, i);
558  return ret;
559  }
560  }
561  }
562 
563  return 0;
564 }
565 
567 {
568  WMV2DecContext *const w = avctx->priv_data;
569  H263DecContext *const h = &w->ms.h;
570  MpegEncContext *const s = &h->c;
571  int ret;
572 
573  s->private_ctx = &w->common;
574 
575  if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
576  return ret;
577 
578  h->decode_header = wmv2_decode_picture_header;
579  h->decode_mb = wmv2_decode_mb;
580 
582 
584 
585  return ff_intrax8_common_init(avctx, &w->x8, h->block[0],
586  s->mb_width, s->mb_height);
587 }
588 
590 {
591  WMV2DecContext *const w = avctx->priv_data;
592 
593  ff_intrax8_common_end(&w->x8);
594  return ff_mpv_decode_close(avctx);
595 }
596 
598  .p.name = "wmv2",
599  CODEC_LONG_NAME("Windows Media Video 8"),
600  .p.type = AVMEDIA_TYPE_VIDEO,
601  .p.id = AV_CODEC_ID_WMV2,
602  .priv_data_size = sizeof(WMV2DecContext),
607  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
608 };
WMV2DecContext::abt_type_table
int abt_type_table[6]
Definition: wmv2dec.c:47
A
#define A(x)
Definition: vpx_arith.h:28
wmv2_decode_mb
static int wmv2_decode_mb(H263DecContext *const h)
Definition: wmv2dec.c:446
MV_TYPE_16X16
#define MV_TYPE_16X16
1 vector for the whole mb
Definition: mpegvideo.h:175
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:689
wmv2_get_cbp_table_index
static av_always_inline int wmv2_get_cbp_table_index(int qscale, int cbp_index)
Definition: wmv2.h:47
wmv2_decode_inter_block
static int wmv2_decode_inter_block(WMV2DecContext *w, int16_t *block, int n, int cbp)
Definition: wmv2dec.c:404
mem_internal.h
ff_intrax8_decode_picture
int ff_intrax8_decode_picture(IntraX8Context *w, MPVPicture *pict, GetBitContext *gb, int *mb_x, int *mb_y, int dquant, int quant_offset, int loopfilter, int lowdelay)
Decode single IntraX8 frame.
Definition: intrax8.c:721
WMV2DecContext::abt_block2
int16_t abt_block2[6][64]
Definition: wmv2dec.c:56
ff_wmv2_decode_secondary_picture_header
int ff_wmv2_decode_secondary_picture_header(H263DecContext *const h)
Definition: wmv2dec.c:236
WMV2DecContext::skip_type
int skip_type
Definition: wmv2dec.c:54
ff_wmv2_decoder
const FFCodec ff_wmv2_decoder
Definition: wmv2dec.c:597
w
uint8_t w
Definition: llviddspenc.c:38
ff_simple_idct84_add
void ff_simple_idct84_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
Definition: simple_idct.c:189
MSMP4_MB_INTRA_VLC_BITS
#define MSMP4_MB_INTRA_VLC_BITS
Definition: msmpeg4_vc1_data.h:36
wmv2_pred_motion
static int16_t * wmv2_pred_motion(WMV2DecContext *w, int *px, int *py)
Definition: wmv2dec.c:360
MB_TYPE_16x16
#define MB_TYPE_16x16
Definition: mpegutils.h:41
WMV2DecContext::mspel_bit
int mspel_bit
Definition: wmv2dec.c:50
WMV2DecContext::cbp_table_index
int cbp_table_index
Definition: wmv2dec.c:51
FFCodec
Definition: codec_internal.h:127
ff_er_add_slice
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
Definition: error_resilience.c:828
mpegvideo.h
ff_wmv2_add_mb
void ff_wmv2_add_mb(MpegEncContext *s, int16_t block1[6][64], uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr)
Definition: wmv2dec.c:86
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
mpegutils.h
WMV2DecContext::top_left_mv_flag
int top_left_mv_flag
Definition: wmv2dec.c:52
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:512
wmv2_decode_end
static av_cold int wmv2_decode_end(AVCodecContext *avctx)
Definition: wmv2dec.c:589
WMV2Context
Definition: wmv2.h:33
FF_DEBUG_PICT_INFO
#define FF_DEBUG_PICT_INFO
Definition: avcodec.h:1375
MSMP4DecContext::rl_table_index
int rl_table_index
Definition: msmpeg4dec.h:37
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:135
WMV2DecContext::per_block_abt
int per_block_abt
Definition: wmv2dec.c:49
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:333
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:57
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
WMV2DecContext::ms
MSMP4DecContext ms
Definition: wmv2dec.c:40
WMV2DecContext
Definition: wmv2dec.c:39
wrap
#define wrap(func)
Definition: neontest.h:65
WMV2DecContext::x8
IntraX8Context x8
Definition: wmv2dec.c:42
WMV2DecContext::per_mb_rl_bit
int per_mb_rl_bit
Definition: wmv2dec.c:53
GetBitContext
Definition: get_bits.h:109
wmv2_decode_picture_header
static int wmv2_decode_picture_header(H263DecContext *const h)
Definition: wmv2dec.c:205
val
static double val(void *priv, double ch)
Definition: aeval.c:77
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
ff_msmpeg4_decode_motion
void ff_msmpeg4_decode_motion(MSMP4DecContext *const ms, int *mx_ptr, int *my_ptr)
Definition: msmpeg4dec.c:802
WMV2DecContext::abt_type
int abt_type
Definition: wmv2dec.c:46
C
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going which in turn will define variables for the build system and the C
Definition: writing_filters.txt:58
mpegvideodec.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
h263dec.h
av_cold
#define av_cold
Definition: attributes.h:90
SKIP_TYPE_COL
#define SKIP_TYPE_COL
Definition: wmv2.h:30
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:341
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_intrax8_common_init
av_cold int ff_intrax8_common_init(AVCodecContext *avctx, IntraX8Context *w, int16_t block[64], int mb_width, int mb_height)
Initialize IntraX8 frame decoder.
Definition: intrax8.c:679
WMV2DecContext::per_mb_abt
int per_mb_abt
Definition: wmv2dec.c:48
ff_mb_non_intra_vlc
const VLCElem * ff_mb_non_intra_vlc[4]
Definition: msmpeg4dec.c:69
MSMP4DecContext::per_mb_rl_table
int per_mb_rl_table
Definition: msmpeg4dec.h:41
WMV2DecContext::common
WMV2Context common
Definition: wmv2dec.c:41
AV_CODEC_ID_WMV2
@ AV_CODEC_ID_WMV2
Definition: codec_id.h:70
wmv2data.h
ff_simple_idct48_add
void ff_simple_idct48_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
Definition: simple_idct.c:204
WMV2DecContext::j_type
int j_type
Definition: wmv2dec.c:44
B
#define B
Definition: huffyuv.h:42
wmv2_add_block
static void wmv2_add_block(WMV2DecContext *w, int16_t blocks1[][64], uint8_t *dst, int stride, int n)
Definition: wmv2dec.c:59
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
IS_SKIP
#define IS_SKIP(a)
Definition: mpegutils.h:75
simple_idct.h
SKIP_TYPE_NONE
#define SKIP_TYPE_NONE
Definition: wmv2.h:27
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
IntraX8Context
Definition: intrax8.h:28
my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition: dsp.h:57
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
NULL
#define NULL
Definition: coverity.c:32
run
uint8_t run
Definition: svq3.c:207
parse_mb_skip
static int parse_mb_skip(WMV2DecContext *w)
Definition: wmv2dec.c:103
ff_intrax8_common_end
av_cold void ff_intrax8_common_end(IntraX8Context *w)
Destroy IntraX8 frame structure.
Definition: intrax8.c:716
MSMP4DecContext
Definition: msmpeg4dec.h:32
ff_mpv_decode_close
av_cold int ff_mpv_decode_close(AVCodecContext *avctx)
Definition: mpegvideo_dec.c:125
decode_ext_header
static int decode_ext_header(WMV2DecContext *w)
Definition: wmv2dec.c:167
SKIP_TYPE_MPEG
#define SKIP_TYPE_MPEG
Definition: wmv2.h:28
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:386
INTER_INTRA_VLC_BITS
#define INTER_INTRA_VLC_BITS
Definition: msmpeg4dec.h:29
MSMP4DecContext::rl_chroma_table_index
int rl_chroma_table_index
Definition: msmpeg4dec.h:38
mathops.h
ff_h263_decode_frame
int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_frame, AVPacket *avpkt)
Definition: h263dec.c:429
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:646
wmv2.h
ff_inter_intra_vlc
VLCElem ff_inter_intra_vlc[8]
Definition: msmpeg4dec.c:74
intrax8.h
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
ff_msmp4_mb_i_vlc
VLCElem ff_msmp4_mb_i_vlc[536]
Definition: msmpeg4_vc1_data.c:35
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
MB_NON_INTRA_VLC_BITS
#define MB_NON_INTRA_VLC_BITS
Definition: msmpeg4dec.h:30
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:302
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:104
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
ff_wmv2_scantableB
const uint8_t ff_wmv2_scantableB[64]
Definition: wmv2data.c:30
FRAME_SKIPPED
#define FRAME_SKIPPED
Frame is not coded.
Definition: h263dec.h:87
MB_TYPE_SKIP
#define MB_TYPE_SKIP
Definition: mpegutils.h:61
ff_wmv2_scantableA
const uint8_t ff_wmv2_scantableA[64]
Definition: wmv2data.c:23
wmv2_decode_motion
static void wmv2_decode_motion(WMV2DecContext *w, int *mx_ptr, int *my_ptr)
Definition: wmv2dec.c:348
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
block1
static int16_t block1[64]
Definition: dct.c:127
msmpeg4dec.h
SKIP_TYPE_ROW
#define SKIP_TYPE_ROW
Definition: wmv2.h:29
ff_msmpeg4_decode_block
int ff_msmpeg4_decode_block(MSMP4DecContext *const ms, int16_t *block, int n, int coded, const uint8_t *scan_table)
Definition: msmpeg4dec.c:612
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:369
decode012
static int BS_FUNC() decode012(BSCTX *bc)
Return decoded truncated unary code for the values 0, 1, 2.
Definition: bitstream_template.h:444
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
WMV2DecContext::j_type_bit
int j_type_bit
Definition: wmv2dec.c:43
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
avcodec.h
stride
#define stride
Definition: h264pred_template.c:536
msmpeg4.h
mid_pred
#define mid_pred
Definition: mathops.h:97
ret
ret
Definition: filter_design.txt:187
wmv2dec.h
pred
static const float pred[4]
Definition: siprdata.h:259
H263DecContext
Definition: h263dec.h:43
AVCodecContext
main external API structure.
Definition: avcodec.h:431
WMV2DecContext::abt_flag
int abt_flag
Definition: wmv2dec.c:45
wmv2_decode_init
static av_cold int wmv2_decode_init(AVCodecContext *avctx)
Definition: wmv2dec.c:566
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
msmpeg4_vc1_data.h
ER_MB_END
#define ER_MB_END
Definition: error_resilience.h:37
MV_DIR_FORWARD
#define MV_DIR_FORWARD
Definition: mpegvideo.h:171
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
AV_CODEC_CAP_DRAW_HORIZ_BAND
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
Definition: codec.h:44
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
h
h
Definition: vp9dsp_template.c:2070
ff_msmpeg4_decode_init
av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
Definition: msmpeg4dec.c:834
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:63
ff_wmv2_common_init
av_cold void ff_wmv2_common_init(MpegEncContext *s)
Definition: wmv2.c:28
MB_TYPE_FORWARD_MV
#define MB_TYPE_FORWARD_MV
Definition: mpegutils.h:49
ff_msmpeg4_coded_block_pred
int ff_msmpeg4_coded_block_pred(MpegEncContext *s, int n, uint8_t **coded_block_ptr)
Definition: msmpeg4.c:157