FFmpeg
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mpegvideo.c
Go to the documentation of this file.
1 /*
2  * The simplest mpeg encoder (well, it was the simplest!)
3  * Copyright (c) 2000,2001 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
7  *
8  * This file is part of FFmpeg.
9  *
10  * FFmpeg is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * FFmpeg is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with FFmpeg; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 /**
26  * @file
27  * The simplest mpeg encoder (well, it was the simplest!).
28  */
29 
30 #include "libavutil/imgutils.h"
31 #include "avcodec.h"
32 #include "dsputil.h"
33 #include "internal.h"
34 #include "mathops.h"
35 #include "mpegvideo.h"
36 #include "mjpegenc.h"
37 #include "msmpeg4.h"
38 #include "xvmc_internal.h"
39 #include "thread.h"
40 #include <limits.h>
41 
42 //#undef NDEBUG
43 //#include <assert.h>
44 
46  DCTELEM *block, int n, int qscale);
48  DCTELEM *block, int n, int qscale);
50  DCTELEM *block, int n, int qscale);
52  DCTELEM *block, int n, int qscale);
54  DCTELEM *block, int n, int qscale);
56  DCTELEM *block, int n, int qscale);
58  DCTELEM *block, int n, int qscale);
59 
60 
61 //#define DEBUG
62 
63 
65 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
66  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
67  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
68 };
69 
71 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
72  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
73  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
74  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
76  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
77  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
78  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
79  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
80 };
81 
82 static const uint8_t mpeg2_dc_scale_table1[128] = {
83 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
84  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
85  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
86  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
87  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
88  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
89  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
91  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
92 };
93 
94 static const uint8_t mpeg2_dc_scale_table2[128] = {
95 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
96  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
97  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
101  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
102  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
103  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
104 };
105 
106 static const uint8_t mpeg2_dc_scale_table3[128] = {
107 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
108  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
109  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
110  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
111  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
112  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
113  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
114  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
115  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
116 };
117 
118 const uint8_t *const ff_mpeg2_dc_scale_table[4] = {
123 };
124 
128 };
129 
136 };
137 
139  const uint8_t *end,
140  uint32_t *av_restrict state)
141 {
142  int i;
143 
144  assert(p <= end);
145  if (p >= end)
146  return end;
147 
148  for (i = 0; i < 3; i++) {
149  uint32_t tmp = *state << 8;
150  *state = tmp + *(p++);
151  if (tmp == 0x100 || p == end)
152  return p;
153  }
154 
155  while (p < end) {
156  if (p[-1] > 1 ) p += 3;
157  else if (p[-2] ) p += 2;
158  else if (p[-3]|(p[-1]-1)) p++;
159  else {
160  p++;
161  break;
162  }
163  }
164 
165  p = FFMIN(p, end) - 4;
166  *state = AV_RB32(p);
167 
168  return p + 4;
169 }
170 
171 /* init common dct for both encoder and decoder */
173 {
174  ff_dsputil_init(&s->dsp, s->avctx);
176 
182  if (s->flags & CODEC_FLAG_BITEXACT)
185 
186 #if ARCH_X86
188 #elif ARCH_ALPHA
190 #elif ARCH_ARM
192 #elif HAVE_ALTIVEC
194 #elif ARCH_BFIN
196 #endif
197 
198  /* load & permutate scantables
199  * note: only wmv uses different ones
200  */
201  if (s->alternate_scan) {
204  } else {
207  }
210 
211  return 0;
212 }
213 
215 {
216  *dst = *src;
217  dst->f.type = FF_BUFFER_TYPE_COPY;
218 }
219 
220 /**
221  * Release a frame buffer
222  */
224 {
225  /* WM Image / Screen codecs allocate internal buffers with different
226  * dimensions / colorspaces; ignore user-defined callbacks for these. */
227  if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
230  ff_thread_release_buffer(s->avctx, &pic->f);
231  else
234 }
235 
237 {
238  int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
239 
240  // edge emu needs blocksize + filter length - 1
241  // (= 17x17 for halfpel / 21x21 for h264)
242  // VC1 computes luma and chroma simultaneously and needs 19X19 + 9x9
243  // at uvlinesize. It supports only YUV420 so 24x24 is enough
244  // linesize * interlaced * MBsize
245  FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size * 4 * 24,
246  fail);
247 
248  FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size * 4 * 16 * 2,
249  fail)
250  s->me.temp = s->me.scratchpad;
251  s->rd_scratchpad = s->me.scratchpad;
252  s->b_scratchpad = s->me.scratchpad;
253  s->obmc_scratchpad = s->me.scratchpad + 16;
254 
255  return 0;
256 fail:
258  return AVERROR(ENOMEM);
259 }
260 
261 /**
262  * Allocate a frame buffer
263  */
265 {
266  int r, ret;
267 
268  if (s->avctx->hwaccel) {
269  assert(!pic->f.hwaccel_picture_private);
270  if (s->avctx->hwaccel->priv_data_size) {
272  if (!pic->f.hwaccel_picture_private) {
273  av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
274  return -1;
275  }
276  }
277  }
278 
279  if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
282  r = ff_thread_get_buffer(s->avctx, &pic->f);
283  else
284  r = avcodec_default_get_buffer(s->avctx, &pic->f);
285 
286  if (r < 0 || !pic->f.type || !pic->f.data[0]) {
287  av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n",
288  r, pic->f.type, pic->f.data[0]);
290  return -1;
291  }
292 
293  if (s->linesize && (s->linesize != pic->f.linesize[0] ||
294  s->uvlinesize != pic->f.linesize[1])) {
296  "get_buffer() failed (stride changed)\n");
297  free_frame_buffer(s, pic);
298  return -1;
299  }
300 
301  if (pic->f.linesize[1] != pic->f.linesize[2]) {
303  "get_buffer() failed (uv stride mismatch)\n");
304  free_frame_buffer(s, pic);
305  return -1;
306  }
307 
308  if (!s->edge_emu_buffer &&
309  (ret = ff_mpv_frame_size_alloc(s, pic->f.linesize[0])) < 0) {
311  "get_buffer() failed to allocate context scratch buffers.\n");
312  free_frame_buffer(s, pic);
313  return ret;
314  }
315 
316  return 0;
317 }
318 
319 /**
320  * Allocate a Picture.
321  * The pixels are allocated/set by calling get_buffer() if shared = 0
322  */
323 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
324 {
325  const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
326 
327  // the + 1 is needed so memset(,,stride*height) does not sig11
328 
329  const int mb_array_size = s->mb_stride * s->mb_height;
330  const int b8_array_size = s->b8_stride * s->mb_height * 2;
331  const int b4_array_size = s->b4_stride * s->mb_height * 4;
332  int i;
333  int r = -1;
334 
335  if (shared) {
336  assert(pic->f.data[0]);
337  assert(pic->f.type == 0 || pic->f.type == FF_BUFFER_TYPE_SHARED);
339  } else {
340  assert(!pic->f.data[0]);
341 
342  if (alloc_frame_buffer(s, pic) < 0)
343  return -1;
344 
345  s->linesize = pic->f.linesize[0];
346  s->uvlinesize = pic->f.linesize[1];
347  }
348 
349  if (pic->f.qscale_table == NULL) {
350  if (s->encoding) {
351  FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var,
352  mb_array_size * sizeof(int16_t), fail)
354  mb_array_size * sizeof(int16_t), fail)
356  mb_array_size * sizeof(int8_t ), fail)
357  }
358 
360  mb_array_size * sizeof(uint8_t) + 2, fail)// the + 2 is for the slice end check
362  (big_mb_num + s->mb_stride) * sizeof(uint8_t),
363  fail)
365  (big_mb_num + s->mb_stride) * sizeof(uint32_t),
366  fail)
367  pic->f.mb_type = pic->mb_type_base + 2 * s->mb_stride + 1;
368  pic->f.qscale_table = pic->qscale_table_base + 2 * s->mb_stride + 1;
369  if (s->out_format == FMT_H264) {
370  for (i = 0; i < 2; i++) {
372  2 * (b4_array_size + 4) * sizeof(int16_t),
373  fail)
374  pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
375  FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
376  4 * mb_array_size * sizeof(uint8_t), fail)
377  }
378  pic->f.motion_subsample_log2 = 2;
379  } else if (s->out_format == FMT_H263 || s->encoding ||
380  (s->avctx->debug & FF_DEBUG_MV) || s->avctx->debug_mv) {
381  for (i = 0; i < 2; i++) {
383  2 * (b8_array_size + 4) * sizeof(int16_t),
384  fail)
385  pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
386  FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
387  4 * mb_array_size * sizeof(uint8_t), fail)
388  }
389  pic->f.motion_subsample_log2 = 3;
390  }
391  if (s->avctx->debug&FF_DEBUG_DCT_COEFF) {
393  64 * mb_array_size * sizeof(DCTELEM) * 6, fail)
394  }
395  pic->f.qstride = s->mb_stride;
397  1 * sizeof(AVPanScan), fail)
398  }
399 
400  pic->owner2 = s;
401 
402  return 0;
403 fail: // for the FF_ALLOCZ_OR_GOTO macro
404  if (r >= 0)
405  free_frame_buffer(s, pic);
406  return -1;
407 }
408 
409 /**
410  * Deallocate a picture.
411  */
412 static void free_picture(MpegEncContext *s, Picture *pic)
413 {
414  int i;
415 
416  if (pic->f.data[0] && pic->f.type != FF_BUFFER_TYPE_SHARED) {
417  free_frame_buffer(s, pic);
418  }
419 
420  av_freep(&pic->mb_var);
421  av_freep(&pic->mc_mb_var);
422  av_freep(&pic->mb_mean);
423  av_freep(&pic->f.mbskip_table);
425  pic->f.qscale_table = NULL;
426  av_freep(&pic->mb_type_base);
427  pic->f.mb_type = NULL;
428  av_freep(&pic->f.dct_coeff);
429  av_freep(&pic->f.pan_scan);
430  pic->f.mb_type = NULL;
431  for (i = 0; i < 2; i++) {
432  av_freep(&pic->motion_val_base[i]);
433  av_freep(&pic->f.ref_index[i]);
434  pic->f.motion_val[i] = NULL;
435  }
436 
437  if (pic->f.type == FF_BUFFER_TYPE_SHARED) {
438  for (i = 0; i < 4; i++) {
439  pic->f.base[i] =
440  pic->f.data[i] = NULL;
441  }
442  pic->f.type = 0;
443  }
444 }
445 
447 {
448  int y_size = s->b8_stride * (2 * s->mb_height + 1);
449  int c_size = s->mb_stride * (s->mb_height + 1);
450  int yc_size = y_size + 2 * c_size;
451  int i;
452 
453  s->edge_emu_buffer =
454  s->me.scratchpad =
455  s->me.temp =
456  s->rd_scratchpad =
457  s->b_scratchpad =
458  s->obmc_scratchpad = NULL;
459 
460  if (s->encoding) {
461  FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map,
462  ME_MAP_SIZE * sizeof(uint32_t), fail)
464  ME_MAP_SIZE * sizeof(uint32_t), fail)
465  if (s->avctx->noise_reduction) {
467  2 * 64 * sizeof(int), fail)
468  }
469  }
470  FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64 * 12 * 2 * sizeof(DCTELEM), fail)
471  s->block = s->blocks[0];
472 
473  for (i = 0; i < 12; i++) {
474  s->pblocks[i] = &s->block[i];
475  }
476 
477  if (s->out_format == FMT_H263) {
478  /* ac values */
480  yc_size * sizeof(int16_t) * 16, fail);
481  s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
482  s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
483  s->ac_val[2] = s->ac_val[1] + c_size;
484  }
485 
486  return 0;
487 fail:
488  return -1; // free() through ff_MPV_common_end()
489 }
490 
492 {
493  if (s == NULL)
494  return;
495 
497  av_freep(&s->me.scratchpad);
498  s->me.temp =
499  s->rd_scratchpad =
500  s->b_scratchpad =
501  s->obmc_scratchpad = NULL;
502 
503  av_freep(&s->dct_error_sum);
504  av_freep(&s->me.map);
505  av_freep(&s->me.score_map);
506  av_freep(&s->blocks);
507  av_freep(&s->ac_val_base);
508  s->block = NULL;
509 }
510 
512 {
513 #define COPY(a) bak->a = src->a
514  COPY(edge_emu_buffer);
515  COPY(me.scratchpad);
516  COPY(me.temp);
517  COPY(rd_scratchpad);
518  COPY(b_scratchpad);
519  COPY(obmc_scratchpad);
520  COPY(me.map);
521  COPY(me.score_map);
522  COPY(blocks);
523  COPY(block);
524  COPY(start_mb_y);
525  COPY(end_mb_y);
526  COPY(me.map_generation);
527  COPY(pb);
528  COPY(dct_error_sum);
529  COPY(dct_count[0]);
530  COPY(dct_count[1]);
531  COPY(ac_val_base);
532  COPY(ac_val[0]);
533  COPY(ac_val[1]);
534  COPY(ac_val[2]);
535 #undef COPY
536 }
537 
539 {
540  MpegEncContext bak;
541  int i, ret;
542  // FIXME copy only needed parts
543  // START_TIMER
544  backup_duplicate_context(&bak, dst);
545  memcpy(dst, src, sizeof(MpegEncContext));
546  backup_duplicate_context(dst, &bak);
547  for (i = 0; i < 12; i++) {
548  dst->pblocks[i] = &dst->block[i];
549  }
550  if (!dst->edge_emu_buffer &&
551  (ret = ff_mpv_frame_size_alloc(dst, dst->linesize)) < 0) {
552  av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
553  "scratch buffers.\n");
554  return ret;
555  }
556  // STOP_TIMER("update_duplicate_context")
557  // about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
558  return 0;
559 }
560 
562  const AVCodecContext *src)
563 {
564  int i;
565  int err;
566  MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
567 
568  if (dst == src)
569  return 0;
570 
571  av_assert0(s != s1);
572 
573  // FIXME can parameters change on I-frames?
574  // in that case dst may need a reinit
575  if (!s->context_initialized) {
576  memcpy(s, s1, sizeof(MpegEncContext));
577 
578  s->avctx = dst;
579  s->bitstream_buffer = NULL;
581 
582  if (s1->context_initialized){
585  if((err = ff_MPV_common_init(s)) < 0)
586  return err;
587  }
588  }
589 
590  if (s->height != s1->height || s->width != s1->width || s->context_reinit) {
591  s->context_reinit = 0;
592  s->height = s1->height;
593  s->width = s1->width;
594  if ((err = ff_MPV_common_frame_size_change(s)) < 0)
595  return err;
596  }
597 
598  s->avctx->coded_height = s1->avctx->coded_height;
599  s->avctx->coded_width = s1->avctx->coded_width;
600  s->avctx->width = s1->avctx->width;
601  s->avctx->height = s1->avctx->height;
602 
603  s->coded_picture_number = s1->coded_picture_number;
604  s->picture_number = s1->picture_number;
605  s->input_picture_number = s1->input_picture_number;
606 
607  av_assert0(!s->picture || s->picture != s1->picture);
608  memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
609  memcpy(&s->last_picture, &s1->last_picture,
610  (char *) &s1->last_picture_ptr - (char *) &s1->last_picture);
611 
612  // reset s->picture[].f.extended_data to s->picture[].f.data
613  for (i = 0; i < s->picture_count; i++)
614  s->picture[i].f.extended_data = s->picture[i].f.data;
615 
616  s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
617  s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
618  s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
619 
620  // Error/bug resilience
621  s->next_p_frame_damaged = s1->next_p_frame_damaged;
622  s->workaround_bugs = s1->workaround_bugs;
623  s->padding_bug_score = s1->padding_bug_score;
624 
625  // MPEG4 timing info
626  memcpy(&s->time_increment_bits, &s1->time_increment_bits,
627  (char *) &s1->shape - (char *) &s1->time_increment_bits);
628 
629  // B-frame info
630  s->max_b_frames = s1->max_b_frames;
631  s->low_delay = s1->low_delay;
632  s->droppable = s1->droppable;
633 
634  // DivX handling (doesn't work)
635  s->divx_packed = s1->divx_packed;
636 
637  if (s1->bitstream_buffer) {
638  if (s1->bitstream_buffer_size +
642  s1->allocated_bitstream_buffer_size);
643  s->bitstream_buffer_size = s1->bitstream_buffer_size;
644  memcpy(s->bitstream_buffer, s1->bitstream_buffer,
645  s1->bitstream_buffer_size);
646  memset(s->bitstream_buffer + s->bitstream_buffer_size, 0,
648  }
649 
650  // linesize dependend scratch buffer allocation
651  if (!s->edge_emu_buffer)
652  if (s1->linesize) {
653  if (ff_mpv_frame_size_alloc(s, s1->linesize) < 0) {
654  av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context "
655  "scratch buffers.\n");
656  return AVERROR(ENOMEM);
657  }
658  } else {
659  av_log(s->avctx, AV_LOG_ERROR, "Context scratch buffers could not "
660  "be allocated due to unknown size.\n");
661  }
662 
663  // MPEG2/interlacing info
664  memcpy(&s->progressive_sequence, &s1->progressive_sequence,
665  (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
666 
667  if (!s1->first_field) {
668  s->last_pict_type = s1->pict_type;
669  if (s1->current_picture_ptr)
670  s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality;
671 
672  if (s1->pict_type != AV_PICTURE_TYPE_B) {
673  s->last_non_b_pict_type = s1->pict_type;
674  }
675  }
676 
677  return 0;
678 }
679 
680 /**
681  * Set the given MpegEncContext to common defaults
682  * (same for encoding and decoding).
683  * The changed fields will not depend upon the
684  * prior state of the MpegEncContext.
685  */
687 {
688  s->y_dc_scale_table =
691  s->progressive_frame = 1;
692  s->progressive_sequence = 1;
694 
695  s->coded_picture_number = 0;
696  s->picture_number = 0;
697  s->input_picture_number = 0;
698 
699  s->picture_in_gop_number = 0;
700 
701  s->f_code = 1;
702  s->b_code = 1;
703 
704  s->picture_range_start = 0;
706 
707  s->slice_context_count = 1;
708 }
709 
710 /**
711  * Set the given MpegEncContext to defaults for decoding.
712  * the changed fields will not depend upon
713  * the prior state of the MpegEncContext.
714  */
716 {
718 }
719 
720 /**
721  * Initialize and allocates MpegEncContext fields dependent on the resolution.
722  */
724 {
725  int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
726 
727  s->mb_width = (s->width + 15) / 16;
728  s->mb_stride = s->mb_width + 1;
729  s->b8_stride = s->mb_width * 2 + 1;
730  s->b4_stride = s->mb_width * 4 + 1;
731  mb_array_size = s->mb_height * s->mb_stride;
732  mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
733 
734  /* set default edge pos, will be overriden
735  * in decode_header if needed */
736  s->h_edge_pos = s->mb_width * 16;
737  s->v_edge_pos = s->mb_height * 16;
738 
739  s->mb_num = s->mb_width * s->mb_height;
740 
741  s->block_wrap[0] =
742  s->block_wrap[1] =
743  s->block_wrap[2] =
744  s->block_wrap[3] = s->b8_stride;
745  s->block_wrap[4] =
746  s->block_wrap[5] = s->mb_stride;
747 
748  y_size = s->b8_stride * (2 * s->mb_height + 1);
749  c_size = s->mb_stride * (s->mb_height + 1);
750  yc_size = y_size + 2 * c_size;
751 
752  FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
753  for (y = 0; y < s->mb_height; y++)
754  for (x = 0; x < s->mb_width; x++)
755  s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
756 
757  s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
758 
759  if (s->encoding) {
760  /* Allocate MV tables */
761  FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
762  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
763  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
764  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
765  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
766  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
767  s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
773 
774  /* Allocate MB type table */
775  FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size * sizeof(uint16_t), fail) // needed for encoding
776 
777  FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
778 
780  mb_array_size * sizeof(float), fail);
782  mb_array_size * sizeof(float), fail);
783 
784  }
785 
787  mb_array_size * sizeof(uint8_t), fail);
789  mb_array_size * sizeof(uint8_t), fail);
790 
792  /* interlaced direct mode decoding tables */
793  for (i = 0; i < 2; i++) {
794  int j, k;
795  for (j = 0; j < 2; j++) {
796  for (k = 0; k < 2; k++) {
798  s->b_field_mv_table_base[i][j][k],
799  mv_table_size * 2 * sizeof(int16_t),
800  fail);
801  s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
802  s->mb_stride + 1;
803  }
804  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
805  FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
806  s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
807  }
808  FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
809  }
810  }
811  if (s->out_format == FMT_H263) {
812  /* cbp values */
813  FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
814  s->coded_block = s->coded_block_base + s->b8_stride + 1;
815 
816  /* cbp, ac_pred, pred_dir */
817  FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail);
818  FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
819  }
820 
821  if (s->h263_pred || s->h263_plus || !s->encoding) {
822  /* dc values */
823  // MN: we need these for error resilience of intra-frames
824  FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
825  s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
826  s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
827  s->dc_val[2] = s->dc_val[1] + c_size;
828  for (i = 0; i < yc_size; i++)
829  s->dc_val_base[i] = 1024;
830  }
831 
832  /* which mb is a intra block */
833  FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
834  memset(s->mbintra_table, 1, mb_array_size);
835 
836  /* init macroblock skip table */
837  FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail);
838  // Note the + 1 is for a quicker mpeg4 slice_end detection
839 
840  return 0;
841 fail:
842  return AVERROR(ENOMEM);
843 }
844 
845 /**
846  * init common structure for both encoder and decoder.
847  * this assumes that some variables like width/height are already set
848  */
850 {
851  int i;
852  int nb_slices = (HAVE_THREADS &&
854  s->avctx->thread_count : 1;
855 
856  if (s->encoding && s->avctx->slices)
857  nb_slices = s->avctx->slices;
858 
860  s->mb_height = (s->height + 31) / 32 * 2;
861  else if (s->codec_id != AV_CODEC_ID_H264)
862  s->mb_height = (s->height + 15) / 16;
863 
864  if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
866  "decoding to AV_PIX_FMT_NONE is not supported.\n");
867  return -1;
868  }
869 
870  if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
871  int max_slices;
872  if (s->mb_height)
873  max_slices = FFMIN(MAX_THREADS, s->mb_height);
874  else
875  max_slices = MAX_THREADS;
876  av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
877  " reducing to %d\n", nb_slices, max_slices);
878  nb_slices = max_slices;
879  }
880 
881  if ((s->width || s->height) &&
882  av_image_check_size(s->width, s->height, 0, s->avctx))
883  return -1;
884 
886 
887  s->flags = s->avctx->flags;
888  s->flags2 = s->avctx->flags2;
889 
890  /* set chroma shifts */
892 
893  /* convert fourcc to upper case */
896 
898 
899  if (s->encoding) {
900  if (s->msmpeg4_version) {
902  2 * 2 * (MAX_LEVEL + 1) *
903  (MAX_RUN + 1) * 2 * sizeof(int), fail);
904  }
905  FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
906 
907  FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail)
908  FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail)
909  FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail)
910  FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
911  FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
912  FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
915 
916  if (s->avctx->noise_reduction) {
917  FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail);
918  }
919  }
920 
923  s->picture_count * sizeof(Picture), fail);
924  for (i = 0; i < s->picture_count; i++) {
926  }
927 
928  if (init_context_frame(s))
929  goto fail;
930 
931  s->parse_context.state = -1;
932 
933  s->context_initialized = 1;
934  s->thread_context[0] = s;
935 
936 // if (s->width && s->height) {
937  if (nb_slices > 1) {
938  for (i = 1; i < nb_slices; i++) {
939  s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
940  memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
941  }
942 
943  for (i = 0; i < nb_slices; i++) {
944  if (init_duplicate_context(s->thread_context[i], s) < 0)
945  goto fail;
946  s->thread_context[i]->start_mb_y =
947  (s->mb_height * (i) + nb_slices / 2) / nb_slices;
948  s->thread_context[i]->end_mb_y =
949  (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
950  }
951  } else {
952  if (init_duplicate_context(s, s) < 0)
953  goto fail;
954  s->start_mb_y = 0;
955  s->end_mb_y = s->mb_height;
956  }
957  s->slice_context_count = nb_slices;
958 // }
959 
960  return 0;
961  fail:
963  return -1;
964 }
965 
966 /**
967  * Frees and resets MpegEncContext fields depending on the resolution.
968  * Is used during resolution changes to avoid a full reinitialization of the
969  * codec.
970  */
972 {
973  int i, j, k;
974 
975  av_freep(&s->mb_type);
982  s->p_mv_table = NULL;
983  s->b_forw_mv_table = NULL;
984  s->b_back_mv_table = NULL;
987  s->b_direct_mv_table = NULL;
988  for (i = 0; i < 2; i++) {
989  for (j = 0; j < 2; j++) {
990  for (k = 0; k < 2; k++) {
991  av_freep(&s->b_field_mv_table_base[i][j][k]);
992  s->b_field_mv_table[i][j][k] = NULL;
993  }
994  av_freep(&s->b_field_select_table[i][j]);
995  av_freep(&s->p_field_mv_table_base[i][j]);
996  s->p_field_mv_table[i][j] = NULL;
997  }
999  }
1000 
1001  av_freep(&s->dc_val_base);
1003  av_freep(&s->mbintra_table);
1004  av_freep(&s->cbp_table);
1005  av_freep(&s->pred_dir_table);
1006 
1007  av_freep(&s->mbskip_table);
1008 
1010  av_freep(&s->er_temp_buffer);
1011  av_freep(&s->mb_index2xy);
1012  av_freep(&s->lambda_table);
1013 
1014  av_freep(&s->cplx_tab);
1015  av_freep(&s->bits_tab);
1016 
1017  s->linesize = s->uvlinesize = 0;
1018 
1019  for (i = 0; i < 3; i++)
1021 
1022  return 0;
1023 }
1024 
1026 {
1027  int i, err = 0;
1028 
1029  if (s->slice_context_count > 1) {
1030  for (i = 0; i < s->slice_context_count; i++) {
1032  }
1033  for (i = 1; i < s->slice_context_count; i++) {
1034  av_freep(&s->thread_context[i]);
1035  }
1036  } else
1038 
1039  free_context_frame(s);
1040 
1041  if (s->picture)
1042  for (i = 0; i < s->picture_count; i++) {
1043  s->picture[i].needs_realloc = 1;
1044  }
1045 
1046  s->last_picture_ptr =
1047  s->next_picture_ptr =
1049 
1050  // init
1052  s->mb_height = (s->height + 31) / 32 * 2;
1053  else if (s->codec_id != AV_CODEC_ID_H264)
1054  s->mb_height = (s->height + 15) / 16;
1055 
1056  if ((s->width || s->height) &&
1057  av_image_check_size(s->width, s->height, 0, s->avctx))
1058  return AVERROR_INVALIDDATA;
1059 
1060  if ((err = init_context_frame(s)))
1061  goto fail;
1062 
1063  s->thread_context[0] = s;
1064 
1065  if (s->width && s->height) {
1066  int nb_slices = s->slice_context_count;
1067  if (nb_slices > 1) {
1068  for (i = 1; i < nb_slices; i++) {
1069  s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1070  memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1071  }
1072 
1073  for (i = 0; i < nb_slices; i++) {
1074  if (init_duplicate_context(s->thread_context[i], s) < 0)
1075  goto fail;
1076  s->thread_context[i]->start_mb_y =
1077  (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1078  s->thread_context[i]->end_mb_y =
1079  (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1080  }
1081  } else {
1082  if (init_duplicate_context(s, s) < 0)
1083  goto fail;
1084  s->start_mb_y = 0;
1085  s->end_mb_y = s->mb_height;
1086  }
1087  s->slice_context_count = nb_slices;
1088  }
1089 
1090  return 0;
1091  fail:
1092  ff_MPV_common_end(s);
1093  return err;
1094 }
1095 
1096 /* init common structure for both encoder and decoder */
1098 {
1099  int i;
1100 
1101  if (s->slice_context_count > 1) {
1102  for (i = 0; i < s->slice_context_count; i++) {
1104  }
1105  for (i = 1; i < s->slice_context_count; i++) {
1106  av_freep(&s->thread_context[i]);
1107  }
1108  s->slice_context_count = 1;
1109  } else free_duplicate_context(s);
1110 
1112  s->parse_context.buffer_size = 0;
1113 
1116 
1117  av_freep(&s->avctx->stats_out);
1118  av_freep(&s->ac_stats);
1119 
1124  av_freep(&s->q_intra_matrix);
1125  av_freep(&s->q_inter_matrix);
1128  av_freep(&s->input_picture);
1130  av_freep(&s->dct_offset);
1131 
1132  if (s->picture && !s->avctx->internal->is_copy) {
1133  for (i = 0; i < s->picture_count; i++) {
1134  free_picture(s, &s->picture[i]);
1135  }
1136  }
1137  av_freep(&s->picture);
1138 
1139  free_context_frame(s);
1140 
1143 
1144  s->context_initialized = 0;
1145  s->last_picture_ptr =
1146  s->next_picture_ptr =
1148  s->linesize = s->uvlinesize = 0;
1149 }
1150 
1152  uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3])
1153 {
1154  int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1];
1155  uint8_t index_run[MAX_RUN + 1];
1156  int last, run, level, start, end, i;
1157 
1158  /* If table is static, we can quit if rl->max_level[0] is not NULL */
1159  if (static_store && rl->max_level[0])
1160  return;
1161 
1162  /* compute max_level[], max_run[] and index_run[] */
1163  for (last = 0; last < 2; last++) {
1164  if (last == 0) {
1165  start = 0;
1166  end = rl->last;
1167  } else {
1168  start = rl->last;
1169  end = rl->n;
1170  }
1171 
1172  memset(max_level, 0, MAX_RUN + 1);
1173  memset(max_run, 0, MAX_LEVEL + 1);
1174  memset(index_run, rl->n, MAX_RUN + 1);
1175  for (i = start; i < end; i++) {
1176  run = rl->table_run[i];
1177  level = rl->table_level[i];
1178  if (index_run[run] == rl->n)
1179  index_run[run] = i;
1180  if (level > max_level[run])
1181  max_level[run] = level;
1182  if (run > max_run[level])
1183  max_run[level] = run;
1184  }
1185  if (static_store)
1186  rl->max_level[last] = static_store[last];
1187  else
1188  rl->max_level[last] = av_malloc(MAX_RUN + 1);
1189  memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1190  if (static_store)
1191  rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1192  else
1193  rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1194  memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1195  if (static_store)
1196  rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1197  else
1198  rl->index_run[last] = av_malloc(MAX_RUN + 1);
1199  memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1200  }
1201 }
1202 
1204 {
1205  int i, q;
1206 
1207  for (q = 0; q < 32; q++) {
1208  int qmul = q * 2;
1209  int qadd = (q - 1) | 1;
1210 
1211  if (q == 0) {
1212  qmul = 1;
1213  qadd = 0;
1214  }
1215  for (i = 0; i < rl->vlc.table_size; i++) {
1216  int code = rl->vlc.table[i][0];
1217  int len = rl->vlc.table[i][1];
1218  int level, run;
1219 
1220  if (len == 0) { // illegal code
1221  run = 66;
1222  level = MAX_LEVEL;
1223  } else if (len < 0) { // more bits needed
1224  run = 0;
1225  level = code;
1226  } else {
1227  if (code == rl->n) { // esc
1228  run = 66;
1229  level = 0;
1230  } else {
1231  run = rl->table_run[code] + 1;
1232  level = rl->table_level[code] * qmul + qadd;
1233  if (code >= rl->last) run += 192;
1234  }
1235  }
1236  rl->rl_vlc[q][i].len = len;
1237  rl->rl_vlc[q][i].level = level;
1238  rl->rl_vlc[q][i].run = run;
1239  }
1240  }
1241 }
1242 
1243 void ff_release_unused_pictures(MpegEncContext*s, int remove_current)
1244 {
1245  int i;
1246 
1247  /* release non reference frames */
1248  for (i = 0; i < s->picture_count; i++) {
1249  if (s->picture[i].f.data[0] && !s->picture[i].f.reference &&
1250  (!s->picture[i].owner2 || s->picture[i].owner2 == s) &&
1251  (remove_current || &s->picture[i] != s->current_picture_ptr)
1252  /* && s->picture[i].type!= FF_BUFFER_TYPE_SHARED */) {
1253  free_frame_buffer(s, &s->picture[i]);
1254  }
1255  }
1256 }
1257 
1258 static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
1259 {
1260  if (pic->f.data[0] == NULL)
1261  return 1;
1262  if (pic->needs_realloc && !(pic->f.reference & DELAYED_PIC_REF))
1263  if (!pic->owner2 || pic->owner2 == s)
1264  return 1;
1265  return 0;
1266 }
1267 
1268 static int find_unused_picture(MpegEncContext *s, int shared)
1269 {
1270  int i;
1271 
1272  if (shared) {
1273  for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1274  if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type == 0)
1275  return i;
1276  }
1277  } else {
1278  for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1279  if (pic_is_unused(s, &s->picture[i]) && s->picture[i].f.type != 0)
1280  return i; // FIXME
1281  }
1282  for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1283  if (pic_is_unused(s, &s->picture[i]))
1284  return i;
1285  }
1286  }
1287 
1289  "Internal error, picture buffer overflow\n");
1290  /* We could return -1, but the codec would crash trying to draw into a
1291  * non-existing frame anyway. This is safer than waiting for a random crash.
1292  * Also the return of this is never useful, an encoder must only allocate
1293  * as much as allowed in the specification. This has no relationship to how
1294  * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1295  * enough for such valid streams).
1296  * Plus, a decoder has to check stream validity and remove frames if too
1297  * many reference frames are around. Waiting for "OOM" is not correct at
1298  * all. Similarly, missing reference frames have to be replaced by
1299  * interpolated/MC frames, anything else is a bug in the codec ...
1300  */
1301  abort();
1302  return -1;
1303 }
1304 
1306 {
1307  int ret = find_unused_picture(s, shared);
1308 
1309  if (ret >= 0 && ret < s->picture_range_end) {
1310  if (s->picture[ret].needs_realloc) {
1311  s->picture[ret].needs_realloc = 0;
1312  free_picture(s, &s->picture[ret]);
1314  }
1315  }
1316  return ret;
1317 }
1318 
1320 {
1321  int intra, i;
1322 
1323  for (intra = 0; intra < 2; intra++) {
1324  if (s->dct_count[intra] > (1 << 16)) {
1325  for (i = 0; i < 64; i++) {
1326  s->dct_error_sum[intra][i] >>= 1;
1327  }
1328  s->dct_count[intra] >>= 1;
1329  }
1330 
1331  for (i = 0; i < 64; i++) {
1332  s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1333  s->dct_count[intra] +
1334  s->dct_error_sum[intra][i] / 2) /
1335  (s->dct_error_sum[intra][i] + 1);
1336  }
1337  }
1338 }
1339 
1340 /**
1341  * generic function for encode/decode called after coding/decoding
1342  * the header and before a frame is coded/decoded.
1343  */
1345 {
1346  int i;
1347  Picture *pic;
1348  s->mb_skipped = 0;
1349 
1350  if (!ff_thread_can_start_frame(avctx)) {
1351  av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
1352  return -1;
1353  }
1354 
1355  /* mark & release old frames */
1356  if (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3) {
1357  if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1359  s->last_picture_ptr->f.data[0]) {
1360  if (s->last_picture_ptr->owner2 == s)
1362  }
1363 
1364  /* release forgotten pictures */
1365  /* if (mpeg124/h263) */
1366  if (!s->encoding) {
1367  for (i = 0; i < s->picture_count; i++) {
1368  if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
1369  &s->picture[i] != s->last_picture_ptr &&
1370  &s->picture[i] != s->next_picture_ptr &&
1371  s->picture[i].f.reference && !s->picture[i].needs_realloc) {
1372  if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1373  av_log(avctx, AV_LOG_ERROR,
1374  "releasing zombie picture\n");
1375  free_frame_buffer(s, &s->picture[i]);
1376  }
1377  }
1378  }
1379  }
1380 
1381  if (!s->encoding) {
1383 
1384  if (s->current_picture_ptr &&
1385  s->current_picture_ptr->f.data[0] == NULL) {
1386  // we already have a unused image
1387  // (maybe it was set before reading the header)
1388  pic = s->current_picture_ptr;
1389  } else {
1390  i = ff_find_unused_picture(s, 0);
1391  if (i < 0) {
1392  av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1393  return i;
1394  }
1395  pic = &s->picture[i];
1396  }
1397 
1398  pic->f.reference = 0;
1399  if (!s->droppable) {
1400  if (s->codec_id == AV_CODEC_ID_H264)
1401  pic->f.reference = s->picture_structure;
1402  else if (s->pict_type != AV_PICTURE_TYPE_B)
1403  pic->f.reference = 3;
1404  }
1405 
1407 
1408  if (ff_alloc_picture(s, pic, 0) < 0)
1409  return -1;
1410 
1411  s->current_picture_ptr = pic;
1412  // FIXME use only the vars from current_pic
1414  if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
1416  if (s->picture_structure != PICT_FRAME)
1419  }
1423  }
1424 
1426  // if (s->flags && CODEC_FLAG_QSCALE)
1427  // s->current_picture_ptr->quality = s->new_picture_ptr->quality;
1429 
1431 
1432  if (s->pict_type != AV_PICTURE_TYPE_B) {
1434  if (!s->droppable)
1436  }
1437  av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
1442  s->pict_type, s->droppable);
1443 
1444  if (s->codec_id != AV_CODEC_ID_H264) {
1445  if ((s->last_picture_ptr == NULL ||
1446  s->last_picture_ptr->f.data[0] == NULL) &&
1447  (s->pict_type != AV_PICTURE_TYPE_I ||
1448  s->picture_structure != PICT_FRAME)) {
1449  if (s->pict_type != AV_PICTURE_TYPE_I)
1450  av_log(avctx, AV_LOG_ERROR,
1451  "warning: first frame is no keyframe\n");
1452  else if (s->picture_structure != PICT_FRAME)
1453  av_log(avctx, AV_LOG_INFO,
1454  "allocate dummy last picture for field based first keyframe\n");
1455 
1456  /* Allocate a dummy frame */
1457  i = ff_find_unused_picture(s, 0);
1458  if (i < 0) {
1459  av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1460  return i;
1461  }
1462  s->last_picture_ptr = &s->picture[i];
1463  s->last_picture_ptr->f.key_frame = 0;
1464  if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
1465  s->last_picture_ptr = NULL;
1466  return -1;
1467  }
1468 
1470  for(i=0; i<avctx->height; i++)
1471  memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width);
1472  }
1473 
1474  ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0);
1475  ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1);
1476  s->last_picture_ptr->f.reference = 3;
1477  }
1478  if ((s->next_picture_ptr == NULL ||
1479  s->next_picture_ptr->f.data[0] == NULL) &&
1480  s->pict_type == AV_PICTURE_TYPE_B) {
1481  /* Allocate a dummy frame */
1482  i = ff_find_unused_picture(s, 0);
1483  if (i < 0) {
1484  av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1485  return i;
1486  }
1487  s->next_picture_ptr = &s->picture[i];
1488  s->next_picture_ptr->f.key_frame = 0;
1489  if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
1490  s->next_picture_ptr = NULL;
1491  return -1;
1492  }
1493  ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 0);
1494  ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 1);
1495  s->next_picture_ptr->f.reference = 3;
1496  }
1497  }
1498 
1499  if (s->last_picture_ptr)
1501  if (s->next_picture_ptr)
1503 
1504  if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME)) {
1505  if (s->next_picture_ptr)
1506  s->next_picture_ptr->owner2 = s;
1507  if (s->last_picture_ptr)
1508  s->last_picture_ptr->owner2 = s;
1509  }
1510 
1511  assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
1512  s->last_picture_ptr->f.data[0]));
1513 
1514  if (s->picture_structure!= PICT_FRAME && s->out_format != FMT_H264) {
1515  int i;
1516  for (i = 0; i < 4; i++) {
1518  s->current_picture.f.data[i] +=
1519  s->current_picture.f.linesize[i];
1520  }
1521  s->current_picture.f.linesize[i] *= 2;
1522  s->last_picture.f.linesize[i] *= 2;
1523  s->next_picture.f.linesize[i] *= 2;
1524  }
1525  }
1526 
1527  s->err_recognition = avctx->err_recognition;
1528 
1529  /* set dequantizer, we can't do it during init as
1530  * it might change for mpeg4 and we can't do it in the header
1531  * decode as init is not called for mpeg4 there yet */
1532  if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1535  } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1538  } else {
1541  }
1542 
1543  if (s->dct_error_sum) {
1544  assert(s->avctx->noise_reduction && s->encoding);
1546  }
1547 
1548  if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1549  return ff_xvmc_field_start(s, avctx);
1550 
1551  return 0;
1552 }
1553 
1554 /* generic function for encode/decode called after a
1555  * frame has been coded/decoded. */
1557 {
1558  int i;
1559  /* redraw edges for the frame if decoding didn't complete */
1560  // just to make sure that all data is rendered.
1561  if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
1562  ff_xvmc_field_end(s);
1563  } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
1564  !s->avctx->hwaccel &&
1566  s->unrestricted_mv &&
1568  !s->intra_only &&
1569  !(s->flags & CODEC_FLAG_EMU_EDGE) &&
1570  !s->avctx->lowres
1571  ) {
1573  int hshift = desc->log2_chroma_w;
1574  int vshift = desc->log2_chroma_h;
1576  s->h_edge_pos, s->v_edge_pos,
1578  EDGE_TOP | EDGE_BOTTOM);
1580  s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1581  EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1582  EDGE_TOP | EDGE_BOTTOM);
1584  s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1585  EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1586  EDGE_TOP | EDGE_BOTTOM);
1587  }
1588 
1589  emms_c();
1590 
1591  s->last_pict_type = s->pict_type;
1593  if (s->pict_type!= AV_PICTURE_TYPE_B) {
1595  }
1596 #if 0
1597  /* copy back current_picture variables */
1598  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1599  if (s->picture[i].f.data[0] == s->current_picture.f.data[0]) {
1600  s->picture[i] = s->current_picture;
1601  break;
1602  }
1603  }
1604  assert(i < MAX_PICTURE_COUNT);
1605 #endif
1606 
1607  if (s->encoding) {
1608  /* release non-reference frames */
1609  for (i = 0; i < s->picture_count; i++) {
1610  if (s->picture[i].f.data[0] && !s->picture[i].f.reference
1611  /* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */) {
1612  free_frame_buffer(s, &s->picture[i]);
1613  }
1614  }
1615  }
1616  // clear copies, to avoid confusion
1617 #if 0
1618  memset(&s->last_picture, 0, sizeof(Picture));
1619  memset(&s->next_picture, 0, sizeof(Picture));
1620  memset(&s->current_picture, 0, sizeof(Picture));
1621 #endif
1623 
1626  }
1627 }
1628 
1629 /**
1630  * Draw a line from (ex, ey) -> (sx, sy).
1631  * @param w width of the image
1632  * @param h height of the image
1633  * @param stride stride/linesize of the image
1634  * @param color color of the arrow
1635  */
1636 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
1637  int w, int h, int stride, int color)
1638 {
1639  int x, y, fr, f;
1640 
1641  sx = av_clip(sx, 0, w - 1);
1642  sy = av_clip(sy, 0, h - 1);
1643  ex = av_clip(ex, 0, w - 1);
1644  ey = av_clip(ey, 0, h - 1);
1645 
1646  buf[sy * stride + sx] += color;
1647 
1648  if (FFABS(ex - sx) > FFABS(ey - sy)) {
1649  if (sx > ex) {
1650  FFSWAP(int, sx, ex);
1651  FFSWAP(int, sy, ey);
1652  }
1653  buf += sx + sy * stride;
1654  ex -= sx;
1655  f = ((ey - sy) << 16) / ex;
1656  for (x = 0; x <= ex; x++) {
1657  y = (x * f) >> 16;
1658  fr = (x * f) & 0xFFFF;
1659  buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1660  if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
1661  }
1662  } else {
1663  if (sy > ey) {
1664  FFSWAP(int, sx, ex);
1665  FFSWAP(int, sy, ey);
1666  }
1667  buf += sx + sy * stride;
1668  ey -= sy;
1669  if (ey)
1670  f = ((ex - sx) << 16) / ey;
1671  else
1672  f = 0;
1673  for(y= 0; y <= ey; y++){
1674  x = (y*f) >> 16;
1675  fr = (y*f) & 0xFFFF;
1676  buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1677  if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
1678  }
1679  }
1680 }
1681 
1682 /**
1683  * Draw an arrow from (ex, ey) -> (sx, sy).
1684  * @param w width of the image
1685  * @param h height of the image
1686  * @param stride stride/linesize of the image
1687  * @param color color of the arrow
1688  */
1689 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
1690  int ey, int w, int h, int stride, int color)
1691 {
1692  int dx,dy;
1693 
1694  sx = av_clip(sx, -100, w + 100);
1695  sy = av_clip(sy, -100, h + 100);
1696  ex = av_clip(ex, -100, w + 100);
1697  ey = av_clip(ey, -100, h + 100);
1698 
1699  dx = ex - sx;
1700  dy = ey - sy;
1701 
1702  if (dx * dx + dy * dy > 3 * 3) {
1703  int rx = dx + dy;
1704  int ry = -dx + dy;
1705  int length = ff_sqrt((rx * rx + ry * ry) << 8);
1706 
1707  // FIXME subpixel accuracy
1708  rx = ROUNDED_DIV(rx * 3 << 4, length);
1709  ry = ROUNDED_DIV(ry * 3 << 4, length);
1710 
1711  draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1712  draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1713  }
1714  draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1715 }
1716 
1717 /**
1718  * Print debugging info for the given picture.
1719  */
1721 {
1722  if ( s->avctx->hwaccel || !pict || !pict->mb_type
1724  return;
1725 
1726 
1728  int x,y;
1729 
1730  av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
1732  for (y = 0; y < s->mb_height; y++) {
1733  for (x = 0; x < s->mb_width; x++) {
1734  if (s->avctx->debug & FF_DEBUG_SKIP) {
1735  int count = s->mbskip_table[x + y * s->mb_stride];
1736  if (count > 9)
1737  count = 9;
1738  av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1739  }
1740  if (s->avctx->debug & FF_DEBUG_QP) {
1741  av_log(s->avctx, AV_LOG_DEBUG, "%2d",
1742  pict->qscale_table[x + y * s->mb_stride]);
1743  }
1744  if (s->avctx->debug & FF_DEBUG_MB_TYPE) {
1745  int mb_type = pict->mb_type[x + y * s->mb_stride];
1746  // Type & MV direction
1747  if (IS_PCM(mb_type))
1748  av_log(s->avctx, AV_LOG_DEBUG, "P");
1749  else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1750  av_log(s->avctx, AV_LOG_DEBUG, "A");
1751  else if (IS_INTRA4x4(mb_type))
1752  av_log(s->avctx, AV_LOG_DEBUG, "i");
1753  else if (IS_INTRA16x16(mb_type))
1754  av_log(s->avctx, AV_LOG_DEBUG, "I");
1755  else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1756  av_log(s->avctx, AV_LOG_DEBUG, "d");
1757  else if (IS_DIRECT(mb_type))
1758  av_log(s->avctx, AV_LOG_DEBUG, "D");
1759  else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
1760  av_log(s->avctx, AV_LOG_DEBUG, "g");
1761  else if (IS_GMC(mb_type))
1762  av_log(s->avctx, AV_LOG_DEBUG, "G");
1763  else if (IS_SKIP(mb_type))
1764  av_log(s->avctx, AV_LOG_DEBUG, "S");
1765  else if (!USES_LIST(mb_type, 1))
1766  av_log(s->avctx, AV_LOG_DEBUG, ">");
1767  else if (!USES_LIST(mb_type, 0))
1768  av_log(s->avctx, AV_LOG_DEBUG, "<");
1769  else {
1770  av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1771  av_log(s->avctx, AV_LOG_DEBUG, "X");
1772  }
1773 
1774  // segmentation
1775  if (IS_8X8(mb_type))
1776  av_log(s->avctx, AV_LOG_DEBUG, "+");
1777  else if (IS_16X8(mb_type))
1778  av_log(s->avctx, AV_LOG_DEBUG, "-");
1779  else if (IS_8X16(mb_type))
1780  av_log(s->avctx, AV_LOG_DEBUG, "|");
1781  else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
1782  av_log(s->avctx, AV_LOG_DEBUG, " ");
1783  else
1784  av_log(s->avctx, AV_LOG_DEBUG, "?");
1785 
1786 
1787  if (IS_INTERLACED(mb_type))
1788  av_log(s->avctx, AV_LOG_DEBUG, "=");
1789  else
1790  av_log(s->avctx, AV_LOG_DEBUG, " ");
1791  }
1792  }
1793  av_log(s->avctx, AV_LOG_DEBUG, "\n");
1794  }
1795  }
1796 
1797  if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
1798  (s->avctx->debug_mv)) {
1799  const int shift = 1 + s->quarter_sample;
1800  int mb_y;
1801  uint8_t *ptr;
1802  int i;
1803  int h_chroma_shift, v_chroma_shift, block_height;
1804  const int width = s->avctx->width;
1805  const int height = s->avctx->height;
1806  const int mv_sample_log2 = 4 - pict->motion_subsample_log2;
1807  const int mv_stride = (s->mb_width << mv_sample_log2) +
1808  (s->codec_id == AV_CODEC_ID_H264 ? 0 : 1);
1809  s->low_delay = 0; // needed to see the vectors without trashing the buffers
1810 
1811  avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1812 
1813  for (i = 0; i < 3; i++) {
1814  size_t size= (i == 0) ? pict->linesize[i] * FFALIGN(height, 16):
1815  pict->linesize[i] * FFALIGN(height, 16) >> v_chroma_shift;
1817  memcpy(s->visualization_buffer[i], pict->data[i], size);
1818  pict->data[i] = s->visualization_buffer[i];
1819  }
1820  pict->type = FF_BUFFER_TYPE_COPY;
1821  pict->opaque= NULL;
1822  ptr = pict->data[0];
1823  block_height = 16 >> v_chroma_shift;
1824 
1825  for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1826  int mb_x;
1827  for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1828  const int mb_index = mb_x + mb_y * s->mb_stride;
1829  if ((s->avctx->debug_mv) && pict->motion_val[0]) {
1830  int type;
1831  for (type = 0; type < 3; type++) {
1832  int direction = 0;
1833  switch (type) {
1834  case 0:
1835  if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
1836  (pict->pict_type!= AV_PICTURE_TYPE_P))
1837  continue;
1838  direction = 0;
1839  break;
1840  case 1:
1841  if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
1842  (pict->pict_type!= AV_PICTURE_TYPE_B))
1843  continue;
1844  direction = 0;
1845  break;
1846  case 2:
1847  if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
1848  (pict->pict_type!= AV_PICTURE_TYPE_B))
1849  continue;
1850  direction = 1;
1851  break;
1852  }
1853  if (!USES_LIST(pict->mb_type[mb_index], direction))
1854  continue;
1855 
1856  if (IS_8X8(pict->mb_type[mb_index])) {
1857  int i;
1858  for (i = 0; i < 4; i++) {
1859  int sx = mb_x * 16 + 4 + 8 * (i & 1);
1860  int sy = mb_y * 16 + 4 + 8 * (i >> 1);
1861  int xy = (mb_x * 2 + (i & 1) +
1862  (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1863  int mx = (pict->motion_val[direction][xy][0] >> shift) + sx;
1864  int my = (pict->motion_val[direction][xy][1] >> shift) + sy;
1865  draw_arrow(ptr, sx, sy, mx, my, width,
1866  height, s->linesize, 100);
1867  }
1868  } else if (IS_16X8(pict->mb_type[mb_index])) {
1869  int i;
1870  for (i = 0; i < 2; i++) {
1871  int sx = mb_x * 16 + 8;
1872  int sy = mb_y * 16 + 4 + 8 * i;
1873  int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
1874  int mx = (pict->motion_val[direction][xy][0] >> shift);
1875  int my = (pict->motion_val[direction][xy][1] >> shift);
1876 
1877  if (IS_INTERLACED(pict->mb_type[mb_index]))
1878  my *= 2;
1879 
1880  draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1881  height, s->linesize, 100);
1882  }
1883  } else if (IS_8X16(pict->mb_type[mb_index])) {
1884  int i;
1885  for (i = 0; i < 2; i++) {
1886  int sx = mb_x * 16 + 4 + 8 * i;
1887  int sy = mb_y * 16 + 8;
1888  int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
1889  int mx = pict->motion_val[direction][xy][0] >> shift;
1890  int my = pict->motion_val[direction][xy][1] >> shift;
1891 
1892  if (IS_INTERLACED(pict->mb_type[mb_index]))
1893  my *= 2;
1894 
1895  draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1896  height, s->linesize, 100);
1897  }
1898  } else {
1899  int sx= mb_x * 16 + 8;
1900  int sy= mb_y * 16 + 8;
1901  int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
1902  int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1903  int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1904  draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1905  }
1906  }
1907  }
1908  if ((s->avctx->debug & FF_DEBUG_VIS_QP)) {
1909  uint64_t c = (pict->qscale_table[mb_index] * 128 / 31) *
1910  0x0101010101010101ULL;
1911  int y;
1912  for (y = 0; y < block_height; y++) {
1913  *(uint64_t *)(pict->data[1] + 8 * mb_x +
1914  (block_height * mb_y + y) *
1915  pict->linesize[1]) = c;
1916  *(uint64_t *)(pict->data[2] + 8 * mb_x +
1917  (block_height * mb_y + y) *
1918  pict->linesize[2]) = c;
1919  }
1920  }
1921  if ((s->avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
1922  pict->motion_val[0]) {
1923  int mb_type = pict->mb_type[mb_index];
1924  uint64_t u,v;
1925  int y;
1926 #define COLOR(theta, r) \
1927  u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
1928  v = (int)(128 + r * sin(theta * 3.141592 / 180));
1929 
1930 
1931  u = v = 128;
1932  if (IS_PCM(mb_type)) {
1933  COLOR(120, 48)
1934  } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
1935  IS_INTRA16x16(mb_type)) {
1936  COLOR(30, 48)
1937  } else if (IS_INTRA4x4(mb_type)) {
1938  COLOR(90, 48)
1939  } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
1940  // COLOR(120, 48)
1941  } else if (IS_DIRECT(mb_type)) {
1942  COLOR(150, 48)
1943  } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
1944  COLOR(170, 48)
1945  } else if (IS_GMC(mb_type)) {
1946  COLOR(190, 48)
1947  } else if (IS_SKIP(mb_type)) {
1948  // COLOR(180, 48)
1949  } else if (!USES_LIST(mb_type, 1)) {
1950  COLOR(240, 48)
1951  } else if (!USES_LIST(mb_type, 0)) {
1952  COLOR(0, 48)
1953  } else {
1954  av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1955  COLOR(300,48)
1956  }
1957 
1958  u *= 0x0101010101010101ULL;
1959  v *= 0x0101010101010101ULL;
1960  for (y = 0; y < block_height; y++) {
1961  *(uint64_t *)(pict->data[1] + 8 * mb_x +
1962  (block_height * mb_y + y) * pict->linesize[1]) = u;
1963  *(uint64_t *)(pict->data[2] + 8 * mb_x +
1964  (block_height * mb_y + y) * pict->linesize[2]) = v;
1965  }
1966 
1967  // segmentation
1968  if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
1969  *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
1970  (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1971  *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
1972  (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1973  }
1974  if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
1975  for (y = 0; y < 16; y++)
1976  pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
1977  pict->linesize[0]] ^= 0x80;
1978  }
1979  if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
1980  int dm = 1 << (mv_sample_log2 - 2);
1981  for (i = 0; i < 4; i++) {
1982  int sx = mb_x * 16 + 8 * (i & 1);
1983  int sy = mb_y * 16 + 8 * (i >> 1);
1984  int xy = (mb_x * 2 + (i & 1) +
1985  (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1986  // FIXME bidir
1987  int32_t *mv = (int32_t *) &pict->motion_val[0][xy];
1988  if (mv[0] != mv[dm] ||
1989  mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
1990  for (y = 0; y < 8; y++)
1991  pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
1992  if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
1993  *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
1994  pict->linesize[0]) ^= 0x8080808080808080ULL;
1995  }
1996  }
1997 
1998  if (IS_INTERLACED(mb_type) &&
1999  s->codec_id == AV_CODEC_ID_H264) {
2000  // hmm
2001  }
2002  }
2003  s->mbskip_table[mb_index] = 0;
2004  }
2005  }
2006  }
2007 }
2008 
2009 static inline int hpel_motion_lowres(MpegEncContext *s,
2010  uint8_t *dest, uint8_t *src,
2011  int field_based, int field_select,
2012  int src_x, int src_y,
2013  int width, int height, int stride,
2014  int h_edge_pos, int v_edge_pos,
2015  int w, int h, h264_chroma_mc_func *pix_op,
2016  int motion_x, int motion_y)
2017 {
2018  const int lowres = s->avctx->lowres;
2019  const int op_index = FFMIN(lowres, 2);
2020  const int s_mask = (2 << lowres) - 1;
2021  int emu = 0;
2022  int sx, sy;
2023 
2024  if (s->quarter_sample) {
2025  motion_x /= 2;
2026  motion_y /= 2;
2027  }
2028 
2029  sx = motion_x & s_mask;
2030  sy = motion_y & s_mask;
2031  src_x += motion_x >> lowres + 1;
2032  src_y += motion_y >> lowres + 1;
2033 
2034  src += src_y * stride + src_x;
2035 
2036  if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
2037  (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2038  s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
2039  (h + 1) << field_based, src_x,
2040  src_y << field_based,
2041  h_edge_pos,
2042  v_edge_pos);
2043  src = s->edge_emu_buffer;
2044  emu = 1;
2045  }
2046 
2047  sx = (sx << 2) >> lowres;
2048  sy = (sy << 2) >> lowres;
2049  if (field_select)
2050  src += s->linesize;
2051  pix_op[op_index](dest, src, stride, h, sx, sy);
2052  return emu;
2053 }
2054 
2055 /* apply one mpeg motion vector to the three components */
2057  uint8_t *dest_y,
2058  uint8_t *dest_cb,
2059  uint8_t *dest_cr,
2060  int field_based,
2061  int bottom_field,
2062  int field_select,
2063  uint8_t **ref_picture,
2064  h264_chroma_mc_func *pix_op,
2065  int motion_x, int motion_y,
2066  int h, int mb_y)
2067 {
2068  uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2069  int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
2070  uvsx, uvsy;
2071  const int lowres = s->avctx->lowres;
2072  const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 2);
2073  const int block_s = 8>>lowres;
2074  const int s_mask = (2 << lowres) - 1;
2075  const int h_edge_pos = s->h_edge_pos >> lowres;
2076  const int v_edge_pos = s->v_edge_pos >> lowres;
2077  linesize = s->current_picture.f.linesize[0] << field_based;
2078  uvlinesize = s->current_picture.f.linesize[1] << field_based;
2079 
2080  // FIXME obviously not perfect but qpel will not work in lowres anyway
2081  if (s->quarter_sample) {
2082  motion_x /= 2;
2083  motion_y /= 2;
2084  }
2085 
2086  if(field_based){
2087  motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2088  }
2089 
2090  sx = motion_x & s_mask;
2091  sy = motion_y & s_mask;
2092  src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2093  src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2094 
2095  if (s->out_format == FMT_H263) {
2096  uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2097  uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2098  uvsrc_x = src_x >> 1;
2099  uvsrc_y = src_y >> 1;
2100  } else if (s->out_format == FMT_H261) {
2101  // even chroma mv's are full pel in H261
2102  mx = motion_x / 4;
2103  my = motion_y / 4;
2104  uvsx = (2 * mx) & s_mask;
2105  uvsy = (2 * my) & s_mask;
2106  uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2107  uvsrc_y = mb_y * block_s + (my >> lowres);
2108  } else {
2109  if(s->chroma_y_shift){
2110  mx = motion_x / 2;
2111  my = motion_y / 2;
2112  uvsx = mx & s_mask;
2113  uvsy = my & s_mask;
2114  uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2115  uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2116  } else {
2117  if(s->chroma_x_shift){
2118  //Chroma422
2119  mx = motion_x / 2;
2120  uvsx = mx & s_mask;
2121  uvsy = motion_y & s_mask;
2122  uvsrc_y = src_y;
2123  uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2124  } else {
2125  //Chroma444
2126  uvsx = motion_x & s_mask;
2127  uvsy = motion_y & s_mask;
2128  uvsrc_x = src_x;
2129  uvsrc_y = src_y;
2130  }
2131  }
2132  }
2133 
2134  ptr_y = ref_picture[0] + src_y * linesize + src_x;
2135  ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2136  ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2137 
2138  if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) || uvsrc_y<0 ||
2139  (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2140  s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2141  linesize >> field_based, 17, 17 + field_based,
2142  src_x, src_y << field_based, h_edge_pos,
2143  v_edge_pos);
2144  ptr_y = s->edge_emu_buffer;
2145  if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2146  uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
2147  s->vdsp.emulated_edge_mc(uvbuf , ptr_cb, uvlinesize >> field_based, 9,
2148  9 + field_based,
2149  uvsrc_x, uvsrc_y << field_based,
2150  h_edge_pos >> 1, v_edge_pos >> 1);
2151  s->vdsp.emulated_edge_mc(uvbuf + 16, ptr_cr, uvlinesize >> field_based, 9,
2152  9 + field_based,
2153  uvsrc_x, uvsrc_y << field_based,
2154  h_edge_pos >> 1, v_edge_pos >> 1);
2155  ptr_cb = uvbuf;
2156  ptr_cr = uvbuf + 16;
2157  }
2158  }
2159 
2160  // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
2161  if (bottom_field) {
2162  dest_y += s->linesize;
2163  dest_cb += s->uvlinesize;
2164  dest_cr += s->uvlinesize;
2165  }
2166 
2167  if (field_select) {
2168  ptr_y += s->linesize;
2169  ptr_cb += s->uvlinesize;
2170  ptr_cr += s->uvlinesize;
2171  }
2172 
2173  sx = (sx << 2) >> lowres;
2174  sy = (sy << 2) >> lowres;
2175  pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2176 
2177  if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2178  int hc = s->chroma_y_shift ? (h+1-bottom_field)>>1 : h;
2179  uvsx = (uvsx << 2) >> lowres;
2180  uvsy = (uvsy << 2) >> lowres;
2181  if (hc) {
2182  pix_op[op_index](dest_cb, ptr_cb, uvlinesize, hc, uvsx, uvsy);
2183  pix_op[op_index](dest_cr, ptr_cr, uvlinesize, hc, uvsx, uvsy);
2184  }
2185  }
2186  // FIXME h261 lowres loop filter
2187 }
2188 
2190  uint8_t *dest_cb, uint8_t *dest_cr,
2191  uint8_t **ref_picture,
2192  h264_chroma_mc_func * pix_op,
2193  int mx, int my)
2194 {
2195  const int lowres = s->avctx->lowres;
2196  const int op_index = FFMIN(lowres, 2);
2197  const int block_s = 8 >> lowres;
2198  const int s_mask = (2 << lowres) - 1;
2199  const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2200  const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2201  int emu = 0, src_x, src_y, offset, sx, sy;
2202  uint8_t *ptr;
2203 
2204  if (s->quarter_sample) {
2205  mx /= 2;
2206  my /= 2;
2207  }
2208 
2209  /* In case of 8X8, we construct a single chroma motion vector
2210  with a special rounding */
2211  mx = ff_h263_round_chroma(mx);
2212  my = ff_h263_round_chroma(my);
2213 
2214  sx = mx & s_mask;
2215  sy = my & s_mask;
2216  src_x = s->mb_x * block_s + (mx >> lowres + 1);
2217  src_y = s->mb_y * block_s + (my >> lowres + 1);
2218 
2219  offset = src_y * s->uvlinesize + src_x;
2220  ptr = ref_picture[1] + offset;
2221  if (s->flags & CODEC_FLAG_EMU_EDGE) {
2222  if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2223  (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2225  9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2226  ptr = s->edge_emu_buffer;
2227  emu = 1;
2228  }
2229  }
2230  sx = (sx << 2) >> lowres;
2231  sy = (sy << 2) >> lowres;
2232  pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2233 
2234  ptr = ref_picture[2] + offset;
2235  if (emu) {
2236  s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2237  src_x, src_y, h_edge_pos, v_edge_pos);
2238  ptr = s->edge_emu_buffer;
2239  }
2240  pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2241 }
2242 
2243 /**
2244  * motion compensation of a single macroblock
2245  * @param s context
2246  * @param dest_y luma destination pointer
2247  * @param dest_cb chroma cb/u destination pointer
2248  * @param dest_cr chroma cr/v destination pointer
2249  * @param dir direction (0->forward, 1->backward)
2250  * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2251  * @param pix_op halfpel motion compensation function (average or put normally)
2252  * the motion vectors are taken from s->mv and the MV type from s->mv_type
2253  */
2254 static inline void MPV_motion_lowres(MpegEncContext *s,
2255  uint8_t *dest_y, uint8_t *dest_cb,
2256  uint8_t *dest_cr,
2257  int dir, uint8_t **ref_picture,
2258  h264_chroma_mc_func *pix_op)
2259 {
2260  int mx, my;
2261  int mb_x, mb_y, i;
2262  const int lowres = s->avctx->lowres;
2263  const int block_s = 8 >>lowres;
2264 
2265  mb_x = s->mb_x;
2266  mb_y = s->mb_y;
2267 
2268  switch (s->mv_type) {
2269  case MV_TYPE_16X16:
2270  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2271  0, 0, 0,
2272  ref_picture, pix_op,
2273  s->mv[dir][0][0], s->mv[dir][0][1],
2274  2 * block_s, mb_y);
2275  break;
2276  case MV_TYPE_8X8:
2277  mx = 0;
2278  my = 0;
2279  for (i = 0; i < 4; i++) {
2280  hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2281  s->linesize) * block_s,
2282  ref_picture[0], 0, 0,
2283  (2 * mb_x + (i & 1)) * block_s,
2284  (2 * mb_y + (i >> 1)) * block_s,
2285  s->width, s->height, s->linesize,
2286  s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2287  block_s, block_s, pix_op,
2288  s->mv[dir][i][0], s->mv[dir][i][1]);
2289 
2290  mx += s->mv[dir][i][0];
2291  my += s->mv[dir][i][1];
2292  }
2293 
2294  if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2295  chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2296  pix_op, mx, my);
2297  break;
2298  case MV_TYPE_FIELD:
2299  if (s->picture_structure == PICT_FRAME) {
2300  /* top field */
2301  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2302  1, 0, s->field_select[dir][0],
2303  ref_picture, pix_op,
2304  s->mv[dir][0][0], s->mv[dir][0][1],
2305  block_s, mb_y);
2306  /* bottom field */
2307  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2308  1, 1, s->field_select[dir][1],
2309  ref_picture, pix_op,
2310  s->mv[dir][1][0], s->mv[dir][1][1],
2311  block_s, mb_y);
2312  } else {
2313  if (s->picture_structure != s->field_select[dir][0] + 1 &&
2314  s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2315  ref_picture = s->current_picture_ptr->f.data;
2316 
2317  }
2318  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2319  0, 0, s->field_select[dir][0],
2320  ref_picture, pix_op,
2321  s->mv[dir][0][0],
2322  s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2323  }
2324  break;
2325  case MV_TYPE_16X8:
2326  for (i = 0; i < 2; i++) {
2327  uint8_t **ref2picture;
2328 
2329  if (s->picture_structure == s->field_select[dir][i] + 1 ||
2330  s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2331  ref2picture = ref_picture;
2332  } else {
2333  ref2picture = s->current_picture_ptr->f.data;
2334  }
2335 
2336  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2337  0, 0, s->field_select[dir][i],
2338  ref2picture, pix_op,
2339  s->mv[dir][i][0], s->mv[dir][i][1] +
2340  2 * block_s * i, block_s, mb_y >> 1);
2341 
2342  dest_y += 2 * block_s * s->linesize;
2343  dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2344  dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2345  }
2346  break;
2347  case MV_TYPE_DMV:
2348  if (s->picture_structure == PICT_FRAME) {
2349  for (i = 0; i < 2; i++) {
2350  int j;
2351  for (j = 0; j < 2; j++) {
2352  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2353  1, j, j ^ i,
2354  ref_picture, pix_op,
2355  s->mv[dir][2 * i + j][0],
2356  s->mv[dir][2 * i + j][1],
2357  block_s, mb_y);
2358  }
2359  pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2360  }
2361  } else {
2362  for (i = 0; i < 2; i++) {
2363  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2364  0, 0, s->picture_structure != i + 1,
2365  ref_picture, pix_op,
2366  s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2367  2 * block_s, mb_y >> 1);
2368 
2369  // after put we make avg of the same block
2370  pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2371 
2372  // opposite parity is always in the same
2373  // frame if this is second field
2374  if (!s->first_field) {
2375  ref_picture = s->current_picture_ptr->f.data;
2376  }
2377  }
2378  }
2379  break;
2380  default:
2381  av_assert2(0);
2382  }
2383 }
2384 
2385 /**
2386  * find the lowest MB row referenced in the MVs
2387  */
2389 {
2390  int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2391  int my, off, i, mvs;
2392 
2393  if (s->picture_structure != PICT_FRAME || s->mcsel)
2394  goto unhandled;
2395 
2396  switch (s->mv_type) {
2397  case MV_TYPE_16X16:
2398  mvs = 1;
2399  break;
2400  case MV_TYPE_16X8:
2401  mvs = 2;
2402  break;
2403  case MV_TYPE_8X8:
2404  mvs = 4;
2405  break;
2406  default:
2407  goto unhandled;
2408  }
2409 
2410  for (i = 0; i < mvs; i++) {
2411  my = s->mv[dir][i][1]<<qpel_shift;
2412  my_max = FFMAX(my_max, my);
2413  my_min = FFMIN(my_min, my);
2414  }
2415 
2416  off = (FFMAX(-my_min, my_max) + 63) >> 6;
2417 
2418  return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2419 unhandled:
2420  return s->mb_height-1;
2421 }
2422 
2423 /* put block[] to dest[] */
2424 static inline void put_dct(MpegEncContext *s,
2425  DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2426 {
2427  s->dct_unquantize_intra(s, block, i, qscale);
2428  s->dsp.idct_put (dest, line_size, block);
2429 }
2430 
2431 /* add block[] to dest[] */
2432 static inline void add_dct(MpegEncContext *s,
2433  DCTELEM *block, int i, uint8_t *dest, int line_size)
2434 {
2435  if (s->block_last_index[i] >= 0) {
2436  s->dsp.idct_add (dest, line_size, block);
2437  }
2438 }
2439 
2440 static inline void add_dequant_dct(MpegEncContext *s,
2441  DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2442 {
2443  if (s->block_last_index[i] >= 0) {
2444  s->dct_unquantize_inter(s, block, i, qscale);
2445 
2446  s->dsp.idct_add (dest, line_size, block);
2447  }
2448 }
2449 
2450 /**
2451  * Clean dc, ac, coded_block for the current non-intra MB.
2452  */
2454 {
2455  int wrap = s->b8_stride;
2456  int xy = s->block_index[0];
2457 
2458  s->dc_val[0][xy ] =
2459  s->dc_val[0][xy + 1 ] =
2460  s->dc_val[0][xy + wrap] =
2461  s->dc_val[0][xy + 1 + wrap] = 1024;
2462  /* ac pred */
2463  memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2464  memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2465  if (s->msmpeg4_version>=3) {
2466  s->coded_block[xy ] =
2467  s->coded_block[xy + 1 ] =
2468  s->coded_block[xy + wrap] =
2469  s->coded_block[xy + 1 + wrap] = 0;
2470  }
2471  /* chroma */
2472  wrap = s->mb_stride;
2473  xy = s->mb_x + s->mb_y * wrap;
2474  s->dc_val[1][xy] =
2475  s->dc_val[2][xy] = 1024;
2476  /* ac pred */
2477  memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2478  memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2479 
2480  s->mbintra_table[xy]= 0;
2481 }
2482 
2483 /* generic function called after a macroblock has been parsed by the
2484  decoder or after it has been encoded by the encoder.
2485 
2486  Important variables used:
2487  s->mb_intra : true if intra macroblock
2488  s->mv_dir : motion vector direction
2489  s->mv_type : motion vector type
2490  s->mv : motion vector
2491  s->interlaced_dct : true if interlaced dct used (mpeg2)
2492  */
2493 static av_always_inline
2495  int lowres_flag, int is_mpeg12)
2496 {
2497  const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2498  if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2499  ff_xvmc_decode_mb(s);//xvmc uses pblocks
2500  return;
2501  }
2502 
2503  if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2504  /* save DCT coefficients */
2505  int i,j;
2506  DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2507  av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2508  for(i=0; i<6; i++){
2509  for(j=0; j<64; j++){
2510  *dct++ = block[i][s->dsp.idct_permutation[j]];
2511  av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2512  }
2513  av_log(s->avctx, AV_LOG_DEBUG, "\n");
2514  }
2515  }
2516 
2517  s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2518 
2519  /* update DC predictors for P macroblocks */
2520  if (!s->mb_intra) {
2521  if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2522  if(s->mbintra_table[mb_xy])
2524  } else {
2525  s->last_dc[0] =
2526  s->last_dc[1] =
2527  s->last_dc[2] = 128 << s->intra_dc_precision;
2528  }
2529  }
2530  else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2531  s->mbintra_table[mb_xy]=1;
2532 
2533  if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==AV_PICTURE_TYPE_B) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
2534  uint8_t *dest_y, *dest_cb, *dest_cr;
2535  int dct_linesize, dct_offset;
2536  op_pixels_func (*op_pix)[4];
2537  qpel_mc_func (*op_qpix)[16];
2538  const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2539  const int uvlinesize = s->current_picture.f.linesize[1];
2540  const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2541  const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2542 
2543  /* avoid copy if macroblock skipped in last frame too */
2544  /* skip only during decoding as we might trash the buffers during encoding a bit */
2545  if(!s->encoding){
2546  uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2547 
2548  if (s->mb_skipped) {
2549  s->mb_skipped= 0;
2551  *mbskip_ptr = 1;
2552  } else if(!s->current_picture.f.reference) {
2553  *mbskip_ptr = 1;
2554  } else{
2555  *mbskip_ptr = 0; /* not skipped */
2556  }
2557  }
2558 
2559  dct_linesize = linesize << s->interlaced_dct;
2560  dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
2561 
2562  if(readable){
2563  dest_y= s->dest[0];
2564  dest_cb= s->dest[1];
2565  dest_cr= s->dest[2];
2566  }else{
2567  dest_y = s->b_scratchpad;
2568  dest_cb= s->b_scratchpad+16*linesize;
2569  dest_cr= s->b_scratchpad+32*linesize;
2570  }
2571 
2572  if (!s->mb_intra) {
2573  /* motion handling */
2574  /* decoding or more than one mb_type (MC was already done otherwise) */
2575  if(!s->encoding){
2576 
2577  if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2578  if (s->mv_dir & MV_DIR_FORWARD) {
2581  0);
2582  }
2583  if (s->mv_dir & MV_DIR_BACKWARD) {
2586  0);
2587  }
2588  }
2589 
2590  if(lowres_flag){
2592 
2593  if (s->mv_dir & MV_DIR_FORWARD) {
2594  MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2595  op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2596  }
2597  if (s->mv_dir & MV_DIR_BACKWARD) {
2598  MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2599  }
2600  }else{
2601  op_qpix= s->me.qpel_put;
2602  if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2603  op_pix = s->dsp.put_pixels_tab;
2604  }else{
2605  op_pix = s->dsp.put_no_rnd_pixels_tab;
2606  }
2607  if (s->mv_dir & MV_DIR_FORWARD) {
2608  ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2609  op_pix = s->dsp.avg_pixels_tab;
2610  op_qpix= s->me.qpel_avg;
2611  }
2612  if (s->mv_dir & MV_DIR_BACKWARD) {
2613  ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2614  }
2615  }
2616  }
2617 
2618  /* skip dequant / idct if we are really late ;) */
2619  if(s->avctx->skip_idct){
2622  || s->avctx->skip_idct >= AVDISCARD_ALL)
2623  goto skip_idct;
2624  }
2625 
2626  /* add dct residue */
2628  || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
2629  add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2630  add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2631  add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2632  add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2633 
2634  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2635  if (s->chroma_y_shift){
2636  add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2637  add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2638  }else{
2639  dct_linesize >>= 1;
2640  dct_offset >>=1;
2641  add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2642  add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2643  add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2644  add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2645  }
2646  }
2647  } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
2648  add_dct(s, block[0], 0, dest_y , dct_linesize);
2649  add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2650  add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2651  add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2652 
2653  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2654  if(s->chroma_y_shift){//Chroma420
2655  add_dct(s, block[4], 4, dest_cb, uvlinesize);
2656  add_dct(s, block[5], 5, dest_cr, uvlinesize);
2657  }else{
2658  //chroma422
2659  dct_linesize = uvlinesize << s->interlaced_dct;
2660  dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
2661 
2662  add_dct(s, block[4], 4, dest_cb, dct_linesize);
2663  add_dct(s, block[5], 5, dest_cr, dct_linesize);
2664  add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2665  add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2666  if(!s->chroma_x_shift){//Chroma444
2667  add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2668  add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2669  add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2670  add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2671  }
2672  }
2673  }//fi gray
2674  }
2675  else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2676  ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2677  }
2678  } else {
2679  /* dct only in intra block */
2681  put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2682  put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2683  put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2684  put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2685 
2686  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2687  if(s->chroma_y_shift){
2688  put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2689  put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2690  }else{
2691  dct_offset >>=1;
2692  dct_linesize >>=1;
2693  put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2694  put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2695  put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2696  put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2697  }
2698  }
2699  }else{
2700  s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2701  s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2702  s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2703  s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2704 
2705  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2706  if(s->chroma_y_shift){
2707  s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2708  s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2709  }else{
2710 
2711  dct_linesize = uvlinesize << s->interlaced_dct;
2712  dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
2713 
2714  s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2715  s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2716  s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2717  s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2718  if(!s->chroma_x_shift){//Chroma444
2719  s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2720  s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2721  s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2722  s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2723  }
2724  }
2725  }//gray
2726  }
2727  }
2728 skip_idct:
2729  if(!readable){
2730  s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2731  s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2732  s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2733  }
2734  }
2735 }
2736 
2738 #if !CONFIG_SMALL
2739  if(s->out_format == FMT_MPEG1) {
2740  if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2741  else MPV_decode_mb_internal(s, block, 0, 1);
2742  } else
2743 #endif
2744  if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2745  else MPV_decode_mb_internal(s, block, 0, 0);
2746 }
2747 
2748 /**
2749  * @param h is the normal height, this will be reduced automatically if needed for the last row
2750  */
2751 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2752  const int field_pic= s->picture_structure != PICT_FRAME;
2753  if(field_pic){
2754  h <<= 1;
2755  y <<= 1;
2756  }
2757 
2758  if (!s->avctx->hwaccel
2760  && s->unrestricted_mv
2762  && !s->intra_only
2763  && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2765  int sides = 0, edge_h;
2766  int hshift = desc->log2_chroma_w;
2767  int vshift = desc->log2_chroma_h;
2768  if (y==0) sides |= EDGE_TOP;
2769  if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2770 
2771  edge_h= FFMIN(h, s->v_edge_pos - y);
2772 
2773  s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2774  s->linesize, s->h_edge_pos, edge_h,
2775  EDGE_WIDTH, EDGE_WIDTH, sides);
2776  s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2777  s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2778  EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2779  s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2780  s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2781  EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2782  }
2783 
2784  h= FFMIN(h, s->avctx->height - y);
2785 
2786  if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2787 
2788  if (s->avctx->draw_horiz_band) {
2789  AVFrame *src;
2791  int i;
2792 
2794  src = &s->current_picture_ptr->f;
2795  else if(s->last_picture_ptr)
2796  src = &s->last_picture_ptr->f;
2797  else
2798  return;
2799 
2801  for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2802  offset[i] = 0;
2803  }else{
2804  offset[0]= y * s->linesize;
2805  offset[1]=
2806  offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2807  for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2808  offset[i] = 0;
2809  }
2810 
2811  emms_c();
2812 
2813  s->avctx->draw_horiz_band(s->avctx, src, offset,
2814  y, s->picture_structure, h);
2815  }
2816 }
2817 
2818 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2819  const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2820  const int uvlinesize = s->current_picture.f.linesize[1];
2821  const int mb_size= 4 - s->avctx->lowres;
2822 
2823  s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2824  s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2825  s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2826  s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2827  s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2828  s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2829  //block_index is not used by mpeg2, so it is not affected by chroma_format
2830 
2831  s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2832  s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2833  s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2834 
2836  {
2837  if(s->picture_structure==PICT_FRAME){
2838  s->dest[0] += s->mb_y * linesize << mb_size;
2839  s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2840  s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2841  }else{
2842  s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2843  s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2844  s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2846  }
2847  }
2848 }
2849 
2851  int i;
2852  MpegEncContext *s = avctx->priv_data;
2853 
2854  if(s==NULL || s->picture==NULL)
2855  return;
2856 
2857  for(i=0; i<s->picture_count; i++){
2858  if (s->picture[i].f.data[0] &&
2859  (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2860  s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2861  free_frame_buffer(s, &s->picture[i]);
2862  }
2864 
2865  s->mb_x= s->mb_y= 0;
2866  s->closed_gop= 0;
2867 
2868  s->parse_context.state= -1;
2870  s->parse_context.overread= 0;
2872  s->parse_context.index= 0;
2873  s->parse_context.last_index= 0;
2874  s->bitstream_buffer_size=0;
2875  s->pp_time=0;
2876 }
2877 
2879  DCTELEM *block, int n, int qscale)
2880 {
2881  int i, level, nCoeffs;
2882  const uint16_t *quant_matrix;
2883 
2884  nCoeffs= s->block_last_index[n];
2885 
2886  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2887  /* XXX: only mpeg1 */
2888  quant_matrix = s->intra_matrix;
2889  for(i=1;i<=nCoeffs;i++) {
2890  int j= s->intra_scantable.permutated[i];
2891  level = block[j];
2892  if (level) {
2893  if (level < 0) {
2894  level = -level;
2895  level = (int)(level * qscale * quant_matrix[j]) >> 3;
2896  level = (level - 1) | 1;
2897  level = -level;
2898  } else {
2899  level = (int)(level * qscale * quant_matrix[j]) >> 3;
2900  level = (level - 1) | 1;
2901  }
2902  block[j] = level;
2903  }
2904  }
2905 }
2906 
2908  DCTELEM *block, int n, int qscale)
2909 {
2910  int i, level, nCoeffs;
2911  const uint16_t *quant_matrix;
2912 
2913  nCoeffs= s->block_last_index[n];
2914 
2915  quant_matrix = s->inter_matrix;
2916  for(i=0; i<=nCoeffs; i++) {
2917  int j= s->intra_scantable.permutated[i];
2918  level = block[j];
2919  if (level) {
2920  if (level < 0) {
2921  level = -level;
2922  level = (((level << 1) + 1) * qscale *
2923  ((int) (quant_matrix[j]))) >> 4;
2924  level = (level - 1) | 1;
2925  level = -level;
2926  } else {
2927  level = (((level << 1) + 1) * qscale *
2928  ((int) (quant_matrix[j]))) >> 4;
2929  level = (level - 1) | 1;
2930  }
2931  block[j] = level;
2932  }
2933  }
2934 }
2935 
2937  DCTELEM *block, int n, int qscale)
2938 {
2939  int i, level, nCoeffs;
2940  const uint16_t *quant_matrix;
2941 
2942  if(s->alternate_scan) nCoeffs= 63;
2943  else nCoeffs= s->block_last_index[n];
2944 
2945  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2946  quant_matrix = s->intra_matrix;
2947  for(i=1;i<=nCoeffs;i++) {
2948  int j= s->intra_scantable.permutated[i];
2949  level = block[j];
2950  if (level) {
2951  if (level < 0) {
2952  level = -level;
2953  level = (int)(level * qscale * quant_matrix[j]) >> 3;
2954  level = -level;
2955  } else {
2956  level = (int)(level * qscale * quant_matrix[j]) >> 3;
2957  }
2958  block[j] = level;
2959  }
2960  }
2961 }
2962 
2964  DCTELEM *block, int n, int qscale)
2965 {
2966  int i, level, nCoeffs;
2967  const uint16_t *quant_matrix;
2968  int sum=-1;
2969 
2970  if(s->alternate_scan) nCoeffs= 63;
2971  else nCoeffs= s->block_last_index[n];
2972 
2973  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2974  sum += block[0];
2975  quant_matrix = s->intra_matrix;
2976  for(i=1;i<=nCoeffs;i++) {
2977  int j= s->intra_scantable.permutated[i];
2978  level = block[j];
2979  if (level) {
2980  if (level < 0) {
2981  level = -level;
2982  level = (int)(level * qscale * quant_matrix[j]) >> 3;
2983  level = -level;
2984  } else {
2985  level = (int)(level * qscale * quant_matrix[j]) >> 3;
2986  }
2987  block[j] = level;
2988  sum+=level;
2989  }
2990  }
2991  block[63]^=sum&1;
2992 }
2993 
2995  DCTELEM *block, int n, int qscale)
2996 {
2997  int i, level, nCoeffs;
2998  const uint16_t *quant_matrix;
2999  int sum=-1;
3000 
3001  if(s->alternate_scan) nCoeffs= 63;
3002  else nCoeffs= s->block_last_index[n];
3003 
3004  quant_matrix = s->inter_matrix;
3005  for(i=0; i<=nCoeffs; i++) {
3006  int j= s->intra_scantable.permutated[i];
3007  level = block[j];
3008  if (level) {
3009  if (level < 0) {
3010  level = -level;
3011  level = (((level << 1) + 1) * qscale *
3012  ((int) (quant_matrix[j]))) >> 4;
3013  level = -level;
3014  } else {
3015  level = (((level << 1) + 1) * qscale *
3016  ((int) (quant_matrix[j]))) >> 4;
3017  }
3018  block[j] = level;
3019  sum+=level;
3020  }
3021  }
3022  block[63]^=sum&1;
3023 }
3024 
3026  DCTELEM *block, int n, int qscale)
3027 {
3028  int i, level, qmul, qadd;
3029  int nCoeffs;
3030 
3031  assert(s->block_last_index[n]>=0);
3032 
3033  qmul = qscale << 1;
3034 
3035  if (!s->h263_aic) {
3036  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
3037  qadd = (qscale - 1) | 1;
3038  }else{
3039  qadd = 0;
3040  }
3041  if(s->ac_pred)
3042  nCoeffs=63;
3043  else
3044  nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3045 
3046  for(i=1; i<=nCoeffs; i++) {
3047  level = block[i];
3048  if (level) {
3049  if (level < 0) {
3050  level = level * qmul - qadd;
3051  } else {
3052  level = level * qmul + qadd;
3053  }
3054  block[i] = level;
3055  }
3056  }
3057 }
3058 
3060  DCTELEM *block, int n, int qscale)
3061 {
3062  int i, level, qmul, qadd;
3063  int nCoeffs;
3064 
3065  assert(s->block_last_index[n]>=0);
3066 
3067  qadd = (qscale - 1) | 1;
3068  qmul = qscale << 1;
3069 
3070  nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3071 
3072  for(i=0; i<=nCoeffs; i++) {
3073  level = block[i];
3074  if (level) {
3075  if (level < 0) {
3076  level = level * qmul - qadd;
3077  } else {
3078  level = level * qmul + qadd;
3079  }
3080  block[i] = level;
3081  }
3082  }
3083 }
3084 
3085 /**
3086  * set qscale and update qscale dependent variables.
3087  */
3088 void ff_set_qscale(MpegEncContext * s, int qscale)
3089 {
3090  if (qscale < 1)
3091  qscale = 1;
3092  else if (qscale > 31)
3093  qscale = 31;
3094 
3095  s->qscale = qscale;
3096  s->chroma_qscale= s->chroma_qscale_table[qscale];
3097 
3098  s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3100 }
3101 
3103 {
3106 }