FFmpeg
 All Data Structures Namespaces 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/attributes.h"
31 #include "libavutil/avassert.h"
32 #include "libavutil/imgutils.h"
33 #include "libavutil/internal.h"
35 #include "libavutil/timer.h"
36 #include "avcodec.h"
37 #include "blockdsp.h"
38 #include "h264chroma.h"
39 #include "idctdsp.h"
40 #include "internal.h"
41 #include "mathops.h"
42 #include "mpegutils.h"
43 #include "mpegvideo.h"
44 #include "mjpegenc.h"
45 #include "msmpeg4.h"
46 #include "qpeldsp.h"
47 #include "thread.h"
48 #include <limits.h>
49 
51 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
52  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
53  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
54 };
55 
57 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
58  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
59  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
60  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
61  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
62  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
63  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
64  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
65  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
66 };
67 
68 static const uint8_t mpeg2_dc_scale_table1[128] = {
69 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
70  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
71  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
72  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
73  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
74  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
75  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
76  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
77  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
78 };
79 
80 static const uint8_t mpeg2_dc_scale_table2[128] = {
81 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
82  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
86  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
88  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
89  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
90 };
91 
92 static const uint8_t mpeg2_dc_scale_table3[128] = {
93 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
94  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
95  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
96  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
97  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
98  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
99  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
100  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
101  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
102 };
103 
104 const uint8_t *const ff_mpeg2_dc_scale_table[4] = {
109 };
110 
112  0, 1, 2, 3, 8, 9, 16, 17,
113  10, 11, 4, 5, 6, 7, 15, 14,
114  13, 12, 19, 18, 24, 25, 32, 33,
115  26, 27, 20, 21, 22, 23, 28, 29,
116  30, 31, 34, 35, 40, 41, 48, 49,
117  42, 43, 36, 37, 38, 39, 44, 45,
118  46, 47, 50, 51, 56, 57, 58, 59,
119  52, 53, 54, 55, 60, 61, 62, 63,
120 };
121 
123  0, 8, 16, 24, 1, 9, 2, 10,
124  17, 25, 32, 40, 48, 56, 57, 49,
125  41, 33, 26, 18, 3, 11, 4, 12,
126  19, 27, 34, 42, 50, 58, 35, 43,
127  51, 59, 20, 28, 5, 13, 6, 14,
128  21, 29, 36, 44, 52, 60, 37, 45,
129  53, 61, 22, 30, 7, 15, 23, 31,
130  38, 46, 54, 62, 39, 47, 55, 63,
131 };
132 
134  int16_t *block, int n, int qscale)
135 {
136  int i, level, nCoeffs;
137  const uint16_t *quant_matrix;
138 
139  nCoeffs= s->block_last_index[n];
140 
141  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
142  /* XXX: only mpeg1 */
143  quant_matrix = s->intra_matrix;
144  for(i=1;i<=nCoeffs;i++) {
145  int j= s->intra_scantable.permutated[i];
146  level = block[j];
147  if (level) {
148  if (level < 0) {
149  level = -level;
150  level = (int)(level * qscale * quant_matrix[j]) >> 3;
151  level = (level - 1) | 1;
152  level = -level;
153  } else {
154  level = (int)(level * qscale * quant_matrix[j]) >> 3;
155  level = (level - 1) | 1;
156  }
157  block[j] = level;
158  }
159  }
160 }
161 
163  int16_t *block, int n, int qscale)
164 {
165  int i, level, nCoeffs;
166  const uint16_t *quant_matrix;
167 
168  nCoeffs= s->block_last_index[n];
169 
170  quant_matrix = s->inter_matrix;
171  for(i=0; i<=nCoeffs; i++) {
172  int j= s->intra_scantable.permutated[i];
173  level = block[j];
174  if (level) {
175  if (level < 0) {
176  level = -level;
177  level = (((level << 1) + 1) * qscale *
178  ((int) (quant_matrix[j]))) >> 4;
179  level = (level - 1) | 1;
180  level = -level;
181  } else {
182  level = (((level << 1) + 1) * qscale *
183  ((int) (quant_matrix[j]))) >> 4;
184  level = (level - 1) | 1;
185  }
186  block[j] = level;
187  }
188  }
189 }
190 
192  int16_t *block, int n, int qscale)
193 {
194  int i, level, nCoeffs;
195  const uint16_t *quant_matrix;
196 
197  if(s->alternate_scan) nCoeffs= 63;
198  else nCoeffs= s->block_last_index[n];
199 
200  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
201  quant_matrix = s->intra_matrix;
202  for(i=1;i<=nCoeffs;i++) {
203  int j= s->intra_scantable.permutated[i];
204  level = block[j];
205  if (level) {
206  if (level < 0) {
207  level = -level;
208  level = (int)(level * qscale * quant_matrix[j]) >> 3;
209  level = -level;
210  } else {
211  level = (int)(level * qscale * quant_matrix[j]) >> 3;
212  }
213  block[j] = level;
214  }
215  }
216 }
217 
219  int16_t *block, int n, int qscale)
220 {
221  int i, level, nCoeffs;
222  const uint16_t *quant_matrix;
223  int sum=-1;
224 
225  if(s->alternate_scan) nCoeffs= 63;
226  else nCoeffs= s->block_last_index[n];
227 
228  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
229  sum += block[0];
230  quant_matrix = s->intra_matrix;
231  for(i=1;i<=nCoeffs;i++) {
232  int j= s->intra_scantable.permutated[i];
233  level = block[j];
234  if (level) {
235  if (level < 0) {
236  level = -level;
237  level = (int)(level * qscale * quant_matrix[j]) >> 3;
238  level = -level;
239  } else {
240  level = (int)(level * qscale * quant_matrix[j]) >> 3;
241  }
242  block[j] = level;
243  sum+=level;
244  }
245  }
246  block[63]^=sum&1;
247 }
248 
250  int16_t *block, int n, int qscale)
251 {
252  int i, level, nCoeffs;
253  const uint16_t *quant_matrix;
254  int sum=-1;
255 
256  if(s->alternate_scan) nCoeffs= 63;
257  else nCoeffs= s->block_last_index[n];
258 
259  quant_matrix = s->inter_matrix;
260  for(i=0; i<=nCoeffs; i++) {
261  int j= s->intra_scantable.permutated[i];
262  level = block[j];
263  if (level) {
264  if (level < 0) {
265  level = -level;
266  level = (((level << 1) + 1) * qscale *
267  ((int) (quant_matrix[j]))) >> 4;
268  level = -level;
269  } else {
270  level = (((level << 1) + 1) * qscale *
271  ((int) (quant_matrix[j]))) >> 4;
272  }
273  block[j] = level;
274  sum+=level;
275  }
276  }
277  block[63]^=sum&1;
278 }
279 
281  int16_t *block, int n, int qscale)
282 {
283  int i, level, qmul, qadd;
284  int nCoeffs;
285 
286  av_assert2(s->block_last_index[n]>=0 || s->h263_aic);
287 
288  qmul = qscale << 1;
289 
290  if (!s->h263_aic) {
291  block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
292  qadd = (qscale - 1) | 1;
293  }else{
294  qadd = 0;
295  }
296  if(s->ac_pred)
297  nCoeffs=63;
298  else
299  nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
300 
301  for(i=1; i<=nCoeffs; i++) {
302  level = block[i];
303  if (level) {
304  if (level < 0) {
305  level = level * qmul - qadd;
306  } else {
307  level = level * qmul + qadd;
308  }
309  block[i] = level;
310  }
311  }
312 }
313 
315  int16_t *block, int n, int qscale)
316 {
317  int i, level, qmul, qadd;
318  int nCoeffs;
319 
320  av_assert2(s->block_last_index[n]>=0);
321 
322  qadd = (qscale - 1) | 1;
323  qmul = qscale << 1;
324 
325  nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
326 
327  for(i=0; i<=nCoeffs; i++) {
328  level = block[i];
329  if (level) {
330  if (level < 0) {
331  level = level * qmul - qadd;
332  } else {
333  level = level * qmul + qadd;
334  }
335  block[i] = level;
336  }
337  }
338 }
339 
340 static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
341  int (*mv)[2][4][2],
342  int mb_x, int mb_y, int mb_intra, int mb_skipped)
343 {
344  MpegEncContext *s = opaque;
345 
346  s->mv_dir = mv_dir;
347  s->mv_type = mv_type;
348  s->mb_intra = mb_intra;
349  s->mb_skipped = mb_skipped;
350  s->mb_x = mb_x;
351  s->mb_y = mb_y;
352  memcpy(s->mv, mv, sizeof(*mv));
353 
356 
357  s->bdsp.clear_blocks(s->block[0]);
358 
359  s->dest[0] = s->current_picture.f->data[0] + (s->mb_y * 16 * s->linesize) + s->mb_x * 16;
360  s->dest[1] = s->current_picture.f->data[1] + (s->mb_y * (16 >> s->chroma_y_shift) * s->uvlinesize) + s->mb_x * (16 >> s->chroma_x_shift);
361  s->dest[2] = s->current_picture.f->data[2] + (s->mb_y * (16 >> s->chroma_y_shift) * s->uvlinesize) + s->mb_x * (16 >> s->chroma_x_shift);
362 
363  if (ref)
365  "Interlaced error concealment is not fully implemented\n");
366  ff_mpv_decode_mb(s, s->block);
367 }
368 
369 static void gray16(uint8_t *dst, const uint8_t *src, ptrdiff_t linesize, int h)
370 {
371  while(h--)
372  memset(dst + h*linesize, 128, 16);
373 }
374 
375 static void gray8(uint8_t *dst, const uint8_t *src, ptrdiff_t linesize, int h)
376 {
377  while(h--)
378  memset(dst + h*linesize, 128, 8);
379 }
380 
381 /* init common dct for both encoder and decoder */
383 {
384  ff_blockdsp_init(&s->bdsp, s->avctx);
385  ff_h264chroma_init(&s->h264chroma, 8); //for lowres
386  ff_hpeldsp_init(&s->hdsp, s->avctx->flags);
389 
390  if (s->avctx->debug & FF_DEBUG_NOMC) {
391  int i;
392  for (i=0; i<4; i++) {
393  s->hdsp.avg_pixels_tab[0][i] = gray16;
394  s->hdsp.put_pixels_tab[0][i] = gray16;
395  s->hdsp.put_no_rnd_pixels_tab[0][i] = gray16;
396 
397  s->hdsp.avg_pixels_tab[1][i] = gray8;
398  s->hdsp.put_pixels_tab[1][i] = gray8;
399  s->hdsp.put_no_rnd_pixels_tab[1][i] = gray8;
400  }
401  }
402 
408  if (s->flags & CODEC_FLAG_BITEXACT)
411 
412  if (HAVE_INTRINSICS_NEON)
414 
415  if (ARCH_ALPHA)
417  if (ARCH_ARM)
419  if (ARCH_PPC)
421  if (ARCH_X86)
423 
424  return 0;
425 }
426 
428 {
429  ff_idctdsp_init(&s->idsp, s->avctx);
430 
431  /* load & permutate scantables
432  * note: only wmv uses different ones
433  */
434  if (s->alternate_scan) {
437  } else {
440  }
443 }
444 
445 static int frame_size_alloc(MpegEncContext *s, int linesize)
446 {
447  int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
448 
450  return 0;
451 
452  if (linesize < 24) {
453  av_log(s->avctx, AV_LOG_ERROR, "Image too small, temporary buffers cannot function\n");
454  return AVERROR_PATCHWELCOME;
455  }
456 
457  // edge emu needs blocksize + filter length - 1
458  // (= 17x17 for halfpel / 21x21 for h264)
459  // VC1 computes luma and chroma simultaneously and needs 19X19 + 9x9
460  // at uvlinesize. It supports only YUV420 so 24x24 is enough
461  // linesize * interlaced * MBsize
462  // we also use this buffer for encoding in encode_mb_internal() needig an additional 32 lines
463  FF_ALLOCZ_ARRAY_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size, 4 * 68,
464  fail);
465 
466  FF_ALLOCZ_ARRAY_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size, 4 * 16 * 2,
467  fail)
468  s->me.temp = s->me.scratchpad;
469  s->rd_scratchpad = s->me.scratchpad;
470  s->b_scratchpad = s->me.scratchpad;
471  s->obmc_scratchpad = s->me.scratchpad + 16;
472 
473  return 0;
474 fail:
476  return AVERROR(ENOMEM);
477 }
478 
479 /**
480  * Allocate a frame buffer
481  */
483 {
484  int edges_needed = av_codec_is_encoder(s->avctx->codec);
485  int r, ret;
486 
487  pic->tf.f = pic->f;
488  if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
490  s->codec_id != AV_CODEC_ID_MSS2) {
491  if (edges_needed) {
492  pic->f->width = s->avctx->width + 2 * EDGE_WIDTH;
493  pic->f->height = s->avctx->height + 2 * EDGE_WIDTH;
494  }
495 
496  r = ff_thread_get_buffer(s->avctx, &pic->tf,
497  pic->reference ? AV_GET_BUFFER_FLAG_REF : 0);
498  } else {
499  pic->f->width = s->avctx->width;
500  pic->f->height = s->avctx->height;
501  pic->f->format = s->avctx->pix_fmt;
502  r = avcodec_default_get_buffer2(s->avctx, pic->f, 0);
503  }
504 
505  if (r < 0 || !pic->f->buf[0]) {
506  av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %p)\n",
507  r, pic->f->data[0]);
508  return -1;
509  }
510 
511  if (edges_needed) {
512  int i;
513  for (i = 0; pic->f->data[i]; i++) {
514  int offset = (EDGE_WIDTH >> (i ? s->chroma_y_shift : 0)) *
515  pic->f->linesize[i] +
516  (EDGE_WIDTH >> (i ? s->chroma_x_shift : 0));
517  pic->f->data[i] += offset;
518  }
519  pic->f->width = s->avctx->width;
520  pic->f->height = s->avctx->height;
521  }
522 
523  if (s->avctx->hwaccel) {
524  assert(!pic->hwaccel_picture_private);
527  if (!pic->hwaccel_priv_buf) {
528  av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
529  return -1;
530  }
532  }
533  }
534 
535  if (s->linesize && (s->linesize != pic->f->linesize[0] ||
536  s->uvlinesize != pic->f->linesize[1])) {
538  "get_buffer() failed (stride changed)\n");
539  ff_mpeg_unref_picture(s, pic);
540  return -1;
541  }
542 
543  if (pic->f->linesize[1] != pic->f->linesize[2]) {
545  "get_buffer() failed (uv stride mismatch)\n");
546  ff_mpeg_unref_picture(s, pic);
547  return -1;
548  }
549 
550  if (!s->edge_emu_buffer &&
551  (ret = frame_size_alloc(s, pic->f->linesize[0])) < 0) {
553  "get_buffer() failed to allocate context scratch buffers.\n");
554  ff_mpeg_unref_picture(s, pic);
555  return ret;
556  }
557 
558  return 0;
559 }
560 
562 {
563  int i;
564 
565  pic->alloc_mb_width =
566  pic->alloc_mb_height = 0;
567 
574 
575  for (i = 0; i < 2; i++) {
577  av_buffer_unref(&pic->ref_index_buf[i]);
578  }
579 }
580 
582 {
583  const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
584  const int mb_array_size = s->mb_stride * s->mb_height;
585  const int b8_array_size = s->b8_stride * s->mb_height * 2;
586  int i;
587 
588 
589  pic->mbskip_table_buf = av_buffer_allocz(mb_array_size + 2);
590  pic->qscale_table_buf = av_buffer_allocz(big_mb_num + s->mb_stride);
591  pic->mb_type_buf = av_buffer_allocz((big_mb_num + s->mb_stride) *
592  sizeof(uint32_t));
593  if (!pic->mbskip_table_buf || !pic->qscale_table_buf || !pic->mb_type_buf)
594  return AVERROR(ENOMEM);
595 
596  if (s->encoding) {
597  pic->mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t));
598  pic->mc_mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t));
599  pic->mb_mean_buf = av_buffer_allocz(mb_array_size);
600  if (!pic->mb_var_buf || !pic->mc_mb_var_buf || !pic->mb_mean_buf)
601  return AVERROR(ENOMEM);
602  }
603 
604  if (s->out_format == FMT_H263 || s->encoding || s->avctx->debug_mv ||
606  int mv_size = 2 * (b8_array_size + 4) * sizeof(int16_t);
607  int ref_index_size = 4 * mb_array_size;
608 
609  for (i = 0; mv_size && i < 2; i++) {
610  pic->motion_val_buf[i] = av_buffer_allocz(mv_size);
611  pic->ref_index_buf[i] = av_buffer_allocz(ref_index_size);
612  if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i])
613  return AVERROR(ENOMEM);
614  }
615  }
616 
617  pic->alloc_mb_width = s->mb_width;
618  pic->alloc_mb_height = s->mb_height;
619 
620  return 0;
621 }
622 
624 {
625  int ret, i;
626 #define MAKE_WRITABLE(table) \
627 do {\
628  if (pic->table &&\
629  (ret = av_buffer_make_writable(&pic->table)) < 0)\
630  return ret;\
631 } while (0)
632 
633  MAKE_WRITABLE(mb_var_buf);
634  MAKE_WRITABLE(mc_mb_var_buf);
635  MAKE_WRITABLE(mb_mean_buf);
636  MAKE_WRITABLE(mbskip_table_buf);
637  MAKE_WRITABLE(qscale_table_buf);
638  MAKE_WRITABLE(mb_type_buf);
639 
640  for (i = 0; i < 2; i++) {
641  MAKE_WRITABLE(motion_val_buf[i]);
642  MAKE_WRITABLE(ref_index_buf[i]);
643  }
644 
645  return 0;
646 }
647 
648 /**
649  * Allocate a Picture.
650  * The pixels are allocated/set by calling get_buffer() if shared = 0
651  */
652 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
653 {
654  int i, ret;
655 
656  if (pic->qscale_table_buf)
657  if ( pic->alloc_mb_width != s->mb_width
658  || pic->alloc_mb_height != s->mb_height)
660 
661  if (shared) {
662  av_assert0(pic->f->data[0]);
663  pic->shared = 1;
664  } else {
665  av_assert0(!pic->f->buf[0]);
666 
667  if (alloc_frame_buffer(s, pic) < 0)
668  return -1;
669 
670  s->linesize = pic->f->linesize[0];
671  s->uvlinesize = pic->f->linesize[1];
672  }
673 
674  if (!pic->qscale_table_buf)
675  ret = alloc_picture_tables(s, pic);
676  else
677  ret = make_tables_writable(pic);
678  if (ret < 0)
679  goto fail;
680 
681  if (s->encoding) {
682  pic->mb_var = (uint16_t*)pic->mb_var_buf->data;
683  pic->mc_mb_var = (uint16_t*)pic->mc_mb_var_buf->data;
684  pic->mb_mean = pic->mb_mean_buf->data;
685  }
686 
687  pic->mbskip_table = pic->mbskip_table_buf->data;
688  pic->qscale_table = pic->qscale_table_buf->data + 2 * s->mb_stride + 1;
689  pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * s->mb_stride + 1;
690 
691  if (pic->motion_val_buf[0]) {
692  for (i = 0; i < 2; i++) {
693  pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
694  pic->ref_index[i] = pic->ref_index_buf[i]->data;
695  }
696  }
697 
698  return 0;
699 fail:
700  av_log(s->avctx, AV_LOG_ERROR, "Error allocating a picture.\n");
701  ff_mpeg_unref_picture(s, pic);
703  return AVERROR(ENOMEM);
704 }
705 
706 /**
707  * Deallocate a picture.
708  */
710 {
711  int off = offsetof(Picture, mb_mean) + sizeof(pic->mb_mean);
712 
713  pic->tf.f = pic->f;
714  /* WM Image / Screen codecs allocate internal buffers with different
715  * dimensions / colorspaces; ignore user-defined callbacks for these. */
716  if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
719  ff_thread_release_buffer(s->avctx, &pic->tf);
720  else if (pic->f)
721  av_frame_unref(pic->f);
722 
724 
725  if (pic->needs_realloc)
727 
728  memset((uint8_t*)pic + off, 0, sizeof(*pic) - off);
729 }
730 
732 {
733  int i;
734 
735 #define UPDATE_TABLE(table)\
736 do {\
737  if (src->table &&\
738  (!dst->table || dst->table->buffer != src->table->buffer)) {\
739  av_buffer_unref(&dst->table);\
740  dst->table = av_buffer_ref(src->table);\
741  if (!dst->table) {\
742  ff_free_picture_tables(dst);\
743  return AVERROR(ENOMEM);\
744  }\
745  }\
746 } while (0)
747 
748  UPDATE_TABLE(mb_var_buf);
749  UPDATE_TABLE(mc_mb_var_buf);
750  UPDATE_TABLE(mb_mean_buf);
751  UPDATE_TABLE(mbskip_table_buf);
752  UPDATE_TABLE(qscale_table_buf);
753  UPDATE_TABLE(mb_type_buf);
754  for (i = 0; i < 2; i++) {
755  UPDATE_TABLE(motion_val_buf[i]);
756  UPDATE_TABLE(ref_index_buf[i]);
757  }
758 
759  dst->mb_var = src->mb_var;
760  dst->mc_mb_var = src->mc_mb_var;
761  dst->mb_mean = src->mb_mean;
762  dst->mbskip_table = src->mbskip_table;
763  dst->qscale_table = src->qscale_table;
764  dst->mb_type = src->mb_type;
765  for (i = 0; i < 2; i++) {
766  dst->motion_val[i] = src->motion_val[i];
767  dst->ref_index[i] = src->ref_index[i];
768  }
769 
770  dst->alloc_mb_width = src->alloc_mb_width;
771  dst->alloc_mb_height = src->alloc_mb_height;
772 
773  return 0;
774 }
775 
777 {
778  int ret;
779 
780  av_assert0(!dst->f->buf[0]);
781  av_assert0(src->f->buf[0]);
782 
783  src->tf.f = src->f;
784  dst->tf.f = dst->f;
785  ret = ff_thread_ref_frame(&dst->tf, &src->tf);
786  if (ret < 0)
787  goto fail;
788 
789  ret = update_picture_tables(dst, src);
790  if (ret < 0)
791  goto fail;
792 
793  if (src->hwaccel_picture_private) {
795  if (!dst->hwaccel_priv_buf)
796  goto fail;
798  }
799 
800  dst->field_picture = src->field_picture;
801  dst->mb_var_sum = src->mb_var_sum;
802  dst->mc_mb_var_sum = src->mc_mb_var_sum;
803  dst->b_frame_score = src->b_frame_score;
804  dst->needs_realloc = src->needs_realloc;
805  dst->reference = src->reference;
806  dst->shared = src->shared;
807 
808  return 0;
809 fail:
810  ff_mpeg_unref_picture(s, dst);
811  return ret;
812 }
813 
815 {
816  int16_t (*tmp)[64];
817 
818  tmp = s->pblocks[4];
819  s->pblocks[4] = s->pblocks[5];
820  s->pblocks[5] = tmp;
821 }
822 
824 {
825  int y_size = s->b8_stride * (2 * s->mb_height + 1);
826  int c_size = s->mb_stride * (s->mb_height + 1);
827  int yc_size = y_size + 2 * c_size;
828  int i;
829 
830  if (s->mb_height & 1)
831  yc_size += 2*s->b8_stride + 2*s->mb_stride;
832 
833  s->edge_emu_buffer =
834  s->me.scratchpad =
835  s->me.temp =
836  s->rd_scratchpad =
837  s->b_scratchpad =
838  s->obmc_scratchpad = NULL;
839 
840  if (s->encoding) {
841  FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map,
842  ME_MAP_SIZE * sizeof(uint32_t), fail)
844  ME_MAP_SIZE * sizeof(uint32_t), fail)
845  if (s->avctx->noise_reduction) {
847  2 * 64 * sizeof(int), fail)
848  }
849  }
850  FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64 * 12 * 2 * sizeof(int16_t), fail)
851  s->block = s->blocks[0];
852 
853  for (i = 0; i < 12; i++) {
854  s->pblocks[i] = &s->block[i];
855  }
856  if (s->avctx->codec_tag == AV_RL32("VCR2"))
857  exchange_uv(s);
858 
859  if (s->out_format == FMT_H263) {
860  /* ac values */
862  yc_size * sizeof(int16_t) * 16, fail);
863  s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
864  s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
865  s->ac_val[2] = s->ac_val[1] + c_size;
866  }
867 
868  return 0;
869 fail:
870  return -1; // free() through ff_mpv_common_end()
871 }
872 
874 {
875  if (!s)
876  return;
877 
879  av_freep(&s->me.scratchpad);
880  s->me.temp =
881  s->rd_scratchpad =
882  s->b_scratchpad =
883  s->obmc_scratchpad = NULL;
884 
885  av_freep(&s->dct_error_sum);
886  av_freep(&s->me.map);
887  av_freep(&s->me.score_map);
888  av_freep(&s->blocks);
889  av_freep(&s->ac_val_base);
890  s->block = NULL;
891 }
892 
894 {
895 #define COPY(a) bak->a = src->a
896  COPY(edge_emu_buffer);
897  COPY(me.scratchpad);
898  COPY(me.temp);
899  COPY(rd_scratchpad);
900  COPY(b_scratchpad);
901  COPY(obmc_scratchpad);
902  COPY(me.map);
903  COPY(me.score_map);
904  COPY(blocks);
905  COPY(block);
906  COPY(start_mb_y);
907  COPY(end_mb_y);
908  COPY(me.map_generation);
909  COPY(pb);
910  COPY(dct_error_sum);
911  COPY(dct_count[0]);
912  COPY(dct_count[1]);
913  COPY(ac_val_base);
914  COPY(ac_val[0]);
915  COPY(ac_val[1]);
916  COPY(ac_val[2]);
917 #undef COPY
918 }
919 
921 {
922  MpegEncContext bak;
923  int i, ret;
924  // FIXME copy only needed parts
925  // START_TIMER
926  backup_duplicate_context(&bak, dst);
927  memcpy(dst, src, sizeof(MpegEncContext));
928  backup_duplicate_context(dst, &bak);
929  for (i = 0; i < 12; i++) {
930  dst->pblocks[i] = &dst->block[i];
931  }
932  if (dst->avctx->codec_tag == AV_RL32("VCR2"))
933  exchange_uv(dst);
934  if (!dst->edge_emu_buffer &&
935  (ret = frame_size_alloc(dst, dst->linesize)) < 0) {
936  av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
937  "scratch buffers.\n");
938  return ret;
939  }
940  // STOP_TIMER("update_duplicate_context")
941  // about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
942  return 0;
943 }
944 
946  const AVCodecContext *src)
947 {
948  int i, ret;
949  MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
950 
951  if (dst == src)
952  return 0;
953 
954  av_assert0(s != s1);
955 
956  // FIXME can parameters change on I-frames?
957  // in that case dst may need a reinit
958  if (!s->context_initialized) {
959  int err;
960  memcpy(s, s1, sizeof(MpegEncContext));
961 
962  s->avctx = dst;
963  s->bitstream_buffer = NULL;
965 
966  if (s1->context_initialized){
967 // s->picture_range_start += MAX_PICTURE_COUNT;
968 // s->picture_range_end += MAX_PICTURE_COUNT;
969  ff_mpv_idct_init(s);
970  if((err = ff_mpv_common_init(s)) < 0){
971  memset(s, 0, sizeof(MpegEncContext));
972  s->avctx = dst;
973  return err;
974  }
975  }
976  }
977 
978  if (s->height != s1->height || s->width != s1->width || s->context_reinit) {
979  s->context_reinit = 0;
980  s->height = s1->height;
981  s->width = s1->width;
982  if ((ret = ff_mpv_common_frame_size_change(s)) < 0)
983  return ret;
984  }
985 
986  s->avctx->coded_height = s1->avctx->coded_height;
987  s->avctx->coded_width = s1->avctx->coded_width;
988  s->avctx->width = s1->avctx->width;
989  s->avctx->height = s1->avctx->height;
990 
991  s->coded_picture_number = s1->coded_picture_number;
992  s->picture_number = s1->picture_number;
993 
994  av_assert0(!s->picture || s->picture != s1->picture);
995  if(s->picture)
996  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
997  ff_mpeg_unref_picture(s, &s->picture[i]);
998  if (s1->picture[i].f->buf[0] &&
999  (ret = ff_mpeg_ref_picture(s, &s->picture[i], &s1->picture[i])) < 0)
1000  return ret;
1001  }
1002 
1003 #define UPDATE_PICTURE(pic)\
1004 do {\
1005  ff_mpeg_unref_picture(s, &s->pic);\
1006  if (s1->pic.f && s1->pic.f->buf[0])\
1007  ret = ff_mpeg_ref_picture(s, &s->pic, &s1->pic);\
1008  else\
1009  ret = update_picture_tables(&s->pic, &s1->pic);\
1010  if (ret < 0)\
1011  return ret;\
1012 } while (0)
1013 
1014  UPDATE_PICTURE(current_picture);
1015  UPDATE_PICTURE(last_picture);
1016  UPDATE_PICTURE(next_picture);
1017 
1018 #define REBASE_PICTURE(pic, new_ctx, old_ctx) \
1019  ((pic && pic >= old_ctx->picture && \
1020  pic < old_ctx->picture + MAX_PICTURE_COUNT) ? \
1021  &new_ctx->picture[pic - old_ctx->picture] : NULL)
1022 
1023  s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
1024  s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
1025  s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
1026 
1027  // Error/bug resilience
1028  s->next_p_frame_damaged = s1->next_p_frame_damaged;
1029  s->workaround_bugs = s1->workaround_bugs;
1030  s->padding_bug_score = s1->padding_bug_score;
1031 
1032  // MPEG4 timing info
1033  memcpy(&s->last_time_base, &s1->last_time_base,
1034  (char *) &s1->pb_field_time + sizeof(s1->pb_field_time) -
1035  (char *) &s1->last_time_base);
1036 
1037  // B-frame info
1038  s->max_b_frames = s1->max_b_frames;
1039  s->low_delay = s1->low_delay;
1040  s->droppable = s1->droppable;
1041 
1042  // DivX handling (doesn't work)
1043  s->divx_packed = s1->divx_packed;
1044 
1045  if (s1->bitstream_buffer) {
1046  if (s1->bitstream_buffer_size +
1050  s1->allocated_bitstream_buffer_size);
1051  s->bitstream_buffer_size = s1->bitstream_buffer_size;
1052  memcpy(s->bitstream_buffer, s1->bitstream_buffer,
1053  s1->bitstream_buffer_size);
1054  memset(s->bitstream_buffer + s->bitstream_buffer_size, 0,
1056  }
1057 
1058  // linesize dependend scratch buffer allocation
1059  if (!s->edge_emu_buffer)
1060  if (s1->linesize) {
1061  if (frame_size_alloc(s, s1->linesize) < 0) {
1062  av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context "
1063  "scratch buffers.\n");
1064  return AVERROR(ENOMEM);
1065  }
1066  } else {
1067  av_log(s->avctx, AV_LOG_ERROR, "Context scratch buffers could not "
1068  "be allocated due to unknown size.\n");
1069  }
1070 
1071  // MPEG2/interlacing info
1072  memcpy(&s->progressive_sequence, &s1->progressive_sequence,
1073  (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
1074 
1075  if (!s1->first_field) {
1076  s->last_pict_type = s1->pict_type;
1077  if (s1->current_picture_ptr)
1078  s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f->quality;
1079  }
1080 
1081  return 0;
1082 }
1083 
1084 /**
1085  * Set the given MpegEncContext to common defaults
1086  * (same for encoding and decoding).
1087  * The changed fields will not depend upon the
1088  * prior state of the MpegEncContext.
1089  */
1091 {
1092  s->y_dc_scale_table =
1095  s->progressive_frame = 1;
1096  s->progressive_sequence = 1;
1098 
1099  s->coded_picture_number = 0;
1100  s->picture_number = 0;
1101 
1102  s->f_code = 1;
1103  s->b_code = 1;
1104 
1105  s->slice_context_count = 1;
1106 }
1107 
1108 /**
1109  * Set the given MpegEncContext to defaults for decoding.
1110  * the changed fields will not depend upon
1111  * the prior state of the MpegEncContext.
1112  */
1114 {
1116 }
1117 
1119 {
1120  s->avctx = avctx;
1121  s->width = avctx->coded_width;
1122  s->height = avctx->coded_height;
1123  s->codec_id = avctx->codec->id;
1124  s->workaround_bugs = avctx->workaround_bugs;
1125  s->flags = avctx->flags;
1126  s->flags2 = avctx->flags2;
1127 
1128  /* convert fourcc to upper case */
1129  s->codec_tag = avpriv_toupper4(avctx->codec_tag);
1130 }
1131 
1133 {
1134  ERContext *er = &s->er;
1135  int mb_array_size = s->mb_height * s->mb_stride;
1136  int i;
1137 
1138  er->avctx = s->avctx;
1139 
1140  er->mb_index2xy = s->mb_index2xy;
1141  er->mb_num = s->mb_num;
1142  er->mb_width = s->mb_width;
1143  er->mb_height = s->mb_height;
1144  er->mb_stride = s->mb_stride;
1145  er->b8_stride = s->b8_stride;
1146 
1148  er->error_status_table = av_mallocz(mb_array_size);
1149  if (!er->er_temp_buffer || !er->error_status_table)
1150  goto fail;
1151 
1152  er->mbskip_table = s->mbskip_table;
1153  er->mbintra_table = s->mbintra_table;
1154 
1155  for (i = 0; i < FF_ARRAY_ELEMS(s->dc_val); i++)
1156  er->dc_val[i] = s->dc_val[i];
1157 
1159  er->opaque = s;
1160 
1161  return 0;
1162 fail:
1163  av_freep(&er->er_temp_buffer);
1165  return AVERROR(ENOMEM);
1166 }
1167 
1168 /**
1169  * Initialize and allocates MpegEncContext fields dependent on the resolution.
1170  */
1172 {
1173  int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
1174 
1175  s->mb_width = (s->width + 15) / 16;
1176  s->mb_stride = s->mb_width + 1;
1177  s->b8_stride = s->mb_width * 2 + 1;
1178  mb_array_size = s->mb_height * s->mb_stride;
1179  mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
1180 
1181  /* set default edge pos, will be overridden
1182  * in decode_header if needed */
1183  s->h_edge_pos = s->mb_width * 16;
1184  s->v_edge_pos = s->mb_height * 16;
1185 
1186  s->mb_num = s->mb_width * s->mb_height;
1187 
1188  s->block_wrap[0] =
1189  s->block_wrap[1] =
1190  s->block_wrap[2] =
1191  s->block_wrap[3] = s->b8_stride;
1192  s->block_wrap[4] =
1193  s->block_wrap[5] = s->mb_stride;
1194 
1195  y_size = s->b8_stride * (2 * s->mb_height + 1);
1196  c_size = s->mb_stride * (s->mb_height + 1);
1197  yc_size = y_size + 2 * c_size;
1198 
1199  if (s->mb_height & 1)
1200  yc_size += 2*s->b8_stride + 2*s->mb_stride;
1201 
1202  FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
1203  for (y = 0; y < s->mb_height; y++)
1204  for (x = 0; x < s->mb_width; x++)
1205  s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
1206 
1207  s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
1208 
1209  if (s->encoding) {
1210  /* Allocate MV tables */
1211  FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
1212  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
1213  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
1214  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
1215  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
1216  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
1217  s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
1223 
1224  /* Allocate MB type table */
1225  FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size * sizeof(uint16_t), fail) // needed for encoding
1226 
1227  FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
1228 
1230  mb_array_size * sizeof(float), fail);
1232  mb_array_size * sizeof(float), fail);
1233 
1234  }
1235 
1236  if (s->codec_id == AV_CODEC_ID_MPEG4 ||
1238  /* interlaced direct mode decoding tables */
1239  for (i = 0; i < 2; i++) {
1240  int j, k;
1241  for (j = 0; j < 2; j++) {
1242  for (k = 0; k < 2; k++) {
1244  s->b_field_mv_table_base[i][j][k],
1245  mv_table_size * 2 * sizeof(int16_t),
1246  fail);
1247  s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
1248  s->mb_stride + 1;
1249  }
1250  FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
1251  FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
1252  s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
1253  }
1254  FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
1255  }
1256  }
1257  if (s->out_format == FMT_H263) {
1258  /* cbp values */
1259  FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size + (s->mb_height&1)*2*s->b8_stride, fail);
1260  s->coded_block = s->coded_block_base + s->b8_stride + 1;
1261 
1262  /* cbp, ac_pred, pred_dir */
1263  FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail);
1264  FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
1265  }
1266 
1267  if (s->h263_pred || s->h263_plus || !s->encoding) {
1268  /* dc values */
1269  // MN: we need these for error resilience of intra-frames
1270  FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
1271  s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
1272  s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
1273  s->dc_val[2] = s->dc_val[1] + c_size;
1274  for (i = 0; i < yc_size; i++)
1275  s->dc_val_base[i] = 1024;
1276  }
1277 
1278  /* which mb is a intra block */
1279  FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
1280  memset(s->mbintra_table, 1, mb_array_size);
1281 
1282  /* init macroblock skip table */
1283  FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail);
1284  // Note the + 1 is for a quicker mpeg4 slice_end detection
1285 
1286  return init_er(s);
1287 fail:
1288  return AVERROR(ENOMEM);
1289 }
1290 
1291 /**
1292  * init common structure for both encoder and decoder.
1293  * this assumes that some variables like width/height are already set
1294  */
1296 {
1297  int i;
1298  int nb_slices = (HAVE_THREADS &&
1300  s->avctx->thread_count : 1;
1301 
1302  if (s->encoding && s->avctx->slices)
1303  nb_slices = s->avctx->slices;
1304 
1306  s->mb_height = (s->height + 31) / 32 * 2;
1307  else
1308  s->mb_height = (s->height + 15) / 16;
1309 
1310  if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
1312  "decoding to AV_PIX_FMT_NONE is not supported.\n");
1313  return -1;
1314  }
1315 
1316  if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
1317  int max_slices;
1318  if (s->mb_height)
1319  max_slices = FFMIN(MAX_THREADS, s->mb_height);
1320  else
1321  max_slices = MAX_THREADS;
1322  av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
1323  " reducing to %d\n", nb_slices, max_slices);
1324  nb_slices = max_slices;
1325  }
1326 
1327  if ((s->width || s->height) &&
1328  av_image_check_size(s->width, s->height, 0, s->avctx))
1329  return -1;
1330 
1331  dct_init(s);
1332 
1333  s->flags = s->avctx->flags;
1334  s->flags2 = s->avctx->flags2;
1335 
1336  /* set chroma shifts */
1338  &s->chroma_x_shift,
1339  &s->chroma_y_shift);
1340 
1341 
1343  MAX_PICTURE_COUNT * sizeof(Picture), fail);
1344  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1345  s->picture[i].f = av_frame_alloc();
1346  if (!s->picture[i].f)
1347  goto fail;
1348  }
1349  memset(&s->next_picture, 0, sizeof(s->next_picture));
1350  memset(&s->last_picture, 0, sizeof(s->last_picture));
1351  memset(&s->current_picture, 0, sizeof(s->current_picture));
1352  memset(&s->new_picture, 0, sizeof(s->new_picture));
1353  s->next_picture.f = av_frame_alloc();
1354  if (!s->next_picture.f)
1355  goto fail;
1356  s->last_picture.f = av_frame_alloc();
1357  if (!s->last_picture.f)
1358  goto fail;
1360  if (!s->current_picture.f)
1361  goto fail;
1362  s->new_picture.f = av_frame_alloc();
1363  if (!s->new_picture.f)
1364  goto fail;
1365 
1366  if (init_context_frame(s))
1367  goto fail;
1368 
1369  s->parse_context.state = -1;
1370 
1371  s->context_initialized = 1;
1372  s->thread_context[0] = s;
1373 
1374 // if (s->width && s->height) {
1375  if (nb_slices > 1) {
1376  for (i = 1; i < nb_slices; i++) {
1377  s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1378  memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1379  }
1380 
1381  for (i = 0; i < nb_slices; i++) {
1382  if (init_duplicate_context(s->thread_context[i]) < 0)
1383  goto fail;
1384  s->thread_context[i]->start_mb_y =
1385  (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1386  s->thread_context[i]->end_mb_y =
1387  (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1388  }
1389  } else {
1390  if (init_duplicate_context(s) < 0)
1391  goto fail;
1392  s->start_mb_y = 0;
1393  s->end_mb_y = s->mb_height;
1394  }
1395  s->slice_context_count = nb_slices;
1396 // }
1397 
1398  return 0;
1399  fail:
1400  ff_mpv_common_end(s);
1401  return -1;
1402 }
1403 
1404 /**
1405  * Frees and resets MpegEncContext fields depending on the resolution.
1406  * Is used during resolution changes to avoid a full reinitialization of the
1407  * codec.
1408  */
1410 {
1411  int i, j, k;
1412 
1413  av_freep(&s->mb_type);
1420  s->p_mv_table = NULL;
1421  s->b_forw_mv_table = NULL;
1422  s->b_back_mv_table = NULL;
1425  s->b_direct_mv_table = NULL;
1426  for (i = 0; i < 2; i++) {
1427  for (j = 0; j < 2; j++) {
1428  for (k = 0; k < 2; k++) {
1429  av_freep(&s->b_field_mv_table_base[i][j][k]);
1430  s->b_field_mv_table[i][j][k] = NULL;
1431  }
1432  av_freep(&s->b_field_select_table[i][j]);
1433  av_freep(&s->p_field_mv_table_base[i][j]);
1434  s->p_field_mv_table[i][j] = NULL;
1435  }
1437  }
1438 
1439  av_freep(&s->dc_val_base);
1441  av_freep(&s->mbintra_table);
1442  av_freep(&s->cbp_table);
1443  av_freep(&s->pred_dir_table);
1444 
1445  av_freep(&s->mbskip_table);
1446 
1448  av_freep(&s->er.er_temp_buffer);
1449  av_freep(&s->mb_index2xy);
1450  av_freep(&s->lambda_table);
1451 
1452  av_freep(&s->cplx_tab);
1453  av_freep(&s->bits_tab);
1454 
1455  s->linesize = s->uvlinesize = 0;
1456 }
1457 
1459 {
1460  int i, err = 0;
1461 
1462  if (!s->context_initialized)
1463  return AVERROR(EINVAL);
1464 
1465  if (s->slice_context_count > 1) {
1466  for (i = 0; i < s->slice_context_count; i++) {
1468  }
1469  for (i = 1; i < s->slice_context_count; i++) {
1470  av_freep(&s->thread_context[i]);
1471  }
1472  } else
1474 
1475  free_context_frame(s);
1476 
1477  if (s->picture)
1478  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1479  s->picture[i].needs_realloc = 1;
1480  }
1481 
1482  s->last_picture_ptr =
1483  s->next_picture_ptr =
1485 
1486  // init
1488  s->mb_height = (s->height + 31) / 32 * 2;
1489  else
1490  s->mb_height = (s->height + 15) / 16;
1491 
1492  if ((s->width || s->height) &&
1493  (err = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
1494  goto fail;
1495 
1496  if ((err = init_context_frame(s)))
1497  goto fail;
1498 
1499  s->thread_context[0] = s;
1500 
1501  if (s->width && s->height) {
1502  int nb_slices = s->slice_context_count;
1503  if (nb_slices > 1) {
1504  for (i = 1; i < nb_slices; i++) {
1505  s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1506  memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1507  }
1508 
1509  for (i = 0; i < nb_slices; i++) {
1510  if ((err = init_duplicate_context(s->thread_context[i])) < 0)
1511  goto fail;
1512  s->thread_context[i]->start_mb_y =
1513  (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1514  s->thread_context[i]->end_mb_y =
1515  (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1516  }
1517  } else {
1518  err = init_duplicate_context(s);
1519  if (err < 0)
1520  goto fail;
1521  s->start_mb_y = 0;
1522  s->end_mb_y = s->mb_height;
1523  }
1524  s->slice_context_count = nb_slices;
1525  }
1526 
1527  return 0;
1528  fail:
1529  ff_mpv_common_end(s);
1530  return err;
1531 }
1532 
1533 /* init common structure for both encoder and decoder */
1535 {
1536  int i;
1537 
1538  if (s->slice_context_count > 1) {
1539  for (i = 0; i < s->slice_context_count; i++) {
1541  }
1542  for (i = 1; i < s->slice_context_count; i++) {
1543  av_freep(&s->thread_context[i]);
1544  }
1545  s->slice_context_count = 1;
1546  } else free_duplicate_context(s);
1547 
1549  s->parse_context.buffer_size = 0;
1550 
1553 
1554  if (s->picture) {
1555  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1557  ff_mpeg_unref_picture(s, &s->picture[i]);
1558  av_frame_free(&s->picture[i].f);
1559  }
1560  }
1561  av_freep(&s->picture);
1574 
1575  free_context_frame(s);
1576 
1577  s->context_initialized = 0;
1578  s->last_picture_ptr =
1579  s->next_picture_ptr =
1581  s->linesize = s->uvlinesize = 0;
1582 }
1583 
1585  uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3])
1586 {
1587  int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1];
1588  uint8_t index_run[MAX_RUN + 1];
1589  int last, run, level, start, end, i;
1590 
1591  /* If table is static, we can quit if rl->max_level[0] is not NULL */
1592  if (static_store && rl->max_level[0])
1593  return;
1594 
1595  /* compute max_level[], max_run[] and index_run[] */
1596  for (last = 0; last < 2; last++) {
1597  if (last == 0) {
1598  start = 0;
1599  end = rl->last;
1600  } else {
1601  start = rl->last;
1602  end = rl->n;
1603  }
1604 
1605  memset(max_level, 0, MAX_RUN + 1);
1606  memset(max_run, 0, MAX_LEVEL + 1);
1607  memset(index_run, rl->n, MAX_RUN + 1);
1608  for (i = start; i < end; i++) {
1609  run = rl->table_run[i];
1610  level = rl->table_level[i];
1611  if (index_run[run] == rl->n)
1612  index_run[run] = i;
1613  if (level > max_level[run])
1614  max_level[run] = level;
1615  if (run > max_run[level])
1616  max_run[level] = run;
1617  }
1618  if (static_store)
1619  rl->max_level[last] = static_store[last];
1620  else
1621  rl->max_level[last] = av_malloc(MAX_RUN + 1);
1622  memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1623  if (static_store)
1624  rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1625  else
1626  rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1627  memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1628  if (static_store)
1629  rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1630  else
1631  rl->index_run[last] = av_malloc(MAX_RUN + 1);
1632  memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1633  }
1634 }
1635 
1636 av_cold void ff_init_vlc_rl(RLTable *rl, unsigned static_size)
1637 {
1638  int i, q;
1639  VLC_TYPE table[1500][2] = {{0}};
1640  VLC vlc = { .table = table, .table_allocated = static_size };
1641  av_assert0(static_size <= FF_ARRAY_ELEMS(table));
1642  init_vlc(&vlc, 9, rl->n + 1, &rl->table_vlc[0][1], 4, 2, &rl->table_vlc[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC);
1643 
1644  for (q = 0; q < 32; q++) {
1645  int qmul = q * 2;
1646  int qadd = (q - 1) | 1;
1647 
1648  if (q == 0) {
1649  qmul = 1;
1650  qadd = 0;
1651  }
1652  for (i = 0; i < vlc.table_size; i++) {
1653  int code = vlc.table[i][0];
1654  int len = vlc.table[i][1];
1655  int level, run;
1656 
1657  if (len == 0) { // illegal code
1658  run = 66;
1659  level = MAX_LEVEL;
1660  } else if (len < 0) { // more bits needed
1661  run = 0;
1662  level = code;
1663  } else {
1664  if (code == rl->n) { // esc
1665  run = 66;
1666  level = 0;
1667  } else {
1668  run = rl->table_run[code] + 1;
1669  level = rl->table_level[code] * qmul + qadd;
1670  if (code >= rl->last) run += 192;
1671  }
1672  }
1673  rl->rl_vlc[q][i].len = len;
1674  rl->rl_vlc[q][i].level = level;
1675  rl->rl_vlc[q][i].run = run;
1676  }
1677  }
1678 }
1679 
1681 {
1682  int i;
1683 
1684  /* release non reference frames */
1685  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1686  if (!s->picture[i].reference)
1687  ff_mpeg_unref_picture(s, &s->picture[i]);
1688  }
1689 }
1690 
1691 static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
1692 {
1693  if (pic == s->last_picture_ptr)
1694  return 0;
1695  if (!pic->f->buf[0])
1696  return 1;
1697  if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF))
1698  return 1;
1699  return 0;
1700 }
1701 
1702 static int find_unused_picture(MpegEncContext *s, int shared)
1703 {
1704  int i;
1705 
1706  if (shared) {
1707  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1708  if (!s->picture[i].f->buf[0] && &s->picture[i] != s->last_picture_ptr)
1709  return i;
1710  }
1711  } else {
1712  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1713  if (pic_is_unused(s, &s->picture[i]))
1714  return i;
1715  }
1716  }
1717 
1719  "Internal error, picture buffer overflow\n");
1720  /* We could return -1, but the codec would crash trying to draw into a
1721  * non-existing frame anyway. This is safer than waiting for a random crash.
1722  * Also the return of this is never useful, an encoder must only allocate
1723  * as much as allowed in the specification. This has no relationship to how
1724  * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1725  * enough for such valid streams).
1726  * Plus, a decoder has to check stream validity and remove frames if too
1727  * many reference frames are around. Waiting for "OOM" is not correct at
1728  * all. Similarly, missing reference frames have to be replaced by
1729  * interpolated/MC frames, anything else is a bug in the codec ...
1730  */
1731  abort();
1732  return -1;
1733 }
1734 
1736 {
1737  int ret = find_unused_picture(s, shared);
1738 
1739  if (ret >= 0 && ret < MAX_PICTURE_COUNT) {
1740  if (s->picture[ret].needs_realloc) {
1741  s->picture[ret].needs_realloc = 0;
1742  ff_free_picture_tables(&s->picture[ret]);
1743  ff_mpeg_unref_picture(s, &s->picture[ret]);
1744  }
1745  }
1746  return ret;
1747 }
1748 
1749 static void gray_frame(AVFrame *frame)
1750 {
1751  int i, h_chroma_shift, v_chroma_shift;
1752 
1753  av_pix_fmt_get_chroma_sub_sample(frame->format, &h_chroma_shift, &v_chroma_shift);
1754 
1755  for(i=0; i<frame->height; i++)
1756  memset(frame->data[0] + frame->linesize[0]*i, 0x80, frame->width);
1757  for(i=0; i<FF_CEIL_RSHIFT(frame->height, v_chroma_shift); i++) {
1758  memset(frame->data[1] + frame->linesize[1]*i,
1759  0x80, FF_CEIL_RSHIFT(frame->width, h_chroma_shift));
1760  memset(frame->data[2] + frame->linesize[2]*i,
1761  0x80, FF_CEIL_RSHIFT(frame->width, h_chroma_shift));
1762  }
1763 }
1764 
1765 /**
1766  * generic function called after decoding
1767  * the header and before a frame is decoded.
1768  */
1770 {
1771  int i, ret;
1772  Picture *pic;
1773  s->mb_skipped = 0;
1774 
1775  if (!ff_thread_can_start_frame(avctx)) {
1776  av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
1777  return -1;
1778  }
1779 
1780  /* mark & release old frames */
1781  if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1783  s->last_picture_ptr->f->buf[0]) {
1785  }
1786 
1787  /* release forgotten pictures */
1788  /* if (mpeg124/h263) */
1789  for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1790  if (&s->picture[i] != s->last_picture_ptr &&
1791  &s->picture[i] != s->next_picture_ptr &&
1792  s->picture[i].reference && !s->picture[i].needs_realloc) {
1793  if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1794  av_log(avctx, AV_LOG_ERROR,
1795  "releasing zombie picture\n");
1796  ff_mpeg_unref_picture(s, &s->picture[i]);
1797  }
1798  }
1799 
1801 
1803 
1804  if (s->current_picture_ptr && !s->current_picture_ptr->f->buf[0]) {
1805  // we already have a unused image
1806  // (maybe it was set before reading the header)
1807  pic = s->current_picture_ptr;
1808  } else {
1809  i = ff_find_unused_picture(s, 0);
1810  if (i < 0) {
1811  av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1812  return i;
1813  }
1814  pic = &s->picture[i];
1815  }
1816 
1817  pic->reference = 0;
1818  if (!s->droppable) {
1819  if (s->pict_type != AV_PICTURE_TYPE_B)
1820  pic->reference = 3;
1821  }
1822 
1824 
1825  if (ff_alloc_picture(s, pic, 0) < 0)
1826  return -1;
1827 
1828  s->current_picture_ptr = pic;
1829  // FIXME use only the vars from current_pic
1831  if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
1833  if (s->picture_structure != PICT_FRAME)
1836  }
1840 
1842  // if (s->flags && CODEC_FLAG_QSCALE)
1843  // s->current_picture_ptr->quality = s->new_picture_ptr->quality;
1845 
1846  if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
1847  s->current_picture_ptr)) < 0)
1848  return ret;
1849 
1850  if (s->pict_type != AV_PICTURE_TYPE_B) {
1852  if (!s->droppable)
1854  }
1855  av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
1857  s->last_picture_ptr ? s->last_picture_ptr->f->data[0] : NULL,
1858  s->next_picture_ptr ? s->next_picture_ptr->f->data[0] : NULL,
1860  s->pict_type, s->droppable);
1861 
1862  if ((!s->last_picture_ptr || !s->last_picture_ptr->f->buf[0]) &&
1863  (s->pict_type != AV_PICTURE_TYPE_I ||
1864  s->picture_structure != PICT_FRAME)) {
1865  int h_chroma_shift, v_chroma_shift;
1867  &h_chroma_shift, &v_chroma_shift);
1869  av_log(avctx, AV_LOG_DEBUG,
1870  "allocating dummy last picture for B frame\n");
1871  else if (s->pict_type != AV_PICTURE_TYPE_I)
1872  av_log(avctx, AV_LOG_ERROR,
1873  "warning: first frame is no keyframe\n");
1874  else if (s->picture_structure != PICT_FRAME)
1875  av_log(avctx, AV_LOG_DEBUG,
1876  "allocate dummy last picture for field based first keyframe\n");
1877 
1878  /* Allocate a dummy frame */
1879  i = ff_find_unused_picture(s, 0);
1880  if (i < 0) {
1881  av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1882  return i;
1883  }
1884  s->last_picture_ptr = &s->picture[i];
1885 
1886  s->last_picture_ptr->reference = 3;
1887  s->last_picture_ptr->f->key_frame = 0;
1889 
1890  if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
1891  s->last_picture_ptr = NULL;
1892  return -1;
1893  }
1894 
1895  if (!avctx->hwaccel && !(avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)) {
1896  for(i=0; i<avctx->height; i++)
1897  memset(s->last_picture_ptr->f->data[0] + s->last_picture_ptr->f->linesize[0]*i,
1898  0x80, avctx->width);
1899  for(i=0; i<FF_CEIL_RSHIFT(avctx->height, v_chroma_shift); i++) {
1900  memset(s->last_picture_ptr->f->data[1] + s->last_picture_ptr->f->linesize[1]*i,
1901  0x80, FF_CEIL_RSHIFT(avctx->width, h_chroma_shift));
1902  memset(s->last_picture_ptr->f->data[2] + s->last_picture_ptr->f->linesize[2]*i,
1903  0x80, FF_CEIL_RSHIFT(avctx->width, h_chroma_shift));
1904  }
1905 
1907  for(i=0; i<avctx->height; i++)
1908  memset(s->last_picture_ptr->f->data[0] + s->last_picture_ptr->f->linesize[0]*i, 16, avctx->width);
1909  }
1910  }
1911 
1912  ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 0);
1913  ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 1);
1914  }
1915  if ((!s->next_picture_ptr || !s->next_picture_ptr->f->buf[0]) &&
1916  s->pict_type == AV_PICTURE_TYPE_B) {
1917  /* Allocate a dummy frame */
1918  i = ff_find_unused_picture(s, 0);
1919  if (i < 0) {
1920  av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1921  return i;
1922  }
1923  s->next_picture_ptr = &s->picture[i];
1924 
1925  s->next_picture_ptr->reference = 3;
1926  s->next_picture_ptr->f->key_frame = 0;
1928 
1929  if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
1930  s->next_picture_ptr = NULL;
1931  return -1;
1932  }
1933  ff_thread_report_progress(&s->next_picture_ptr->tf, INT_MAX, 0);
1934  ff_thread_report_progress(&s->next_picture_ptr->tf, INT_MAX, 1);
1935  }
1936 
1937 #if 0 // BUFREF-FIXME
1938  memset(s->last_picture.f->data, 0, sizeof(s->last_picture.f->data));
1939  memset(s->next_picture.f->data, 0, sizeof(s->next_picture.f->data));
1940 #endif
1941  if (s->last_picture_ptr) {
1943  if (s->last_picture_ptr->f->buf[0] &&
1944  (ret = ff_mpeg_ref_picture(s, &s->last_picture,
1945  s->last_picture_ptr)) < 0)
1946  return ret;
1947  }
1948  if (s->next_picture_ptr) {
1950  if (s->next_picture_ptr->f->buf[0] &&
1951  (ret = ff_mpeg_ref_picture(s, &s->next_picture,
1952  s->next_picture_ptr)) < 0)
1953  return ret;
1954  }
1955 
1957  s->last_picture_ptr->f->buf[0]));
1958 
1959  if (s->picture_structure!= PICT_FRAME) {
1960  int i;
1961  for (i = 0; i < 4; i++) {
1963  s->current_picture.f->data[i] +=
1964  s->current_picture.f->linesize[i];
1965  }
1966  s->current_picture.f->linesize[i] *= 2;
1967  s->last_picture.f->linesize[i] *= 2;
1968  s->next_picture.f->linesize[i] *= 2;
1969  }
1970  }
1971 
1972  s->err_recognition = avctx->err_recognition;
1973 
1974  /* set dequantizer, we can't do it during init as
1975  * it might change for mpeg4 and we can't do it in the header
1976  * decode as init is not called for mpeg4 there yet */
1977  if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1980  } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1983  } else {
1986  }
1987 
1988  if (s->avctx->debug & FF_DEBUG_NOMC) {
1990  }
1991 
1992  return 0;
1993 }
1994 
1995 /* called after a frame has been decoded. */
1997 {
1998  emms_c();
1999 
2000  if (s->current_picture.reference)
2002 }
2003 
2004 
2005 #if FF_API_VISMV
2006 static int clip_line(int *sx, int *sy, int *ex, int *ey, int maxx)
2007 {
2008  if(*sx > *ex)
2009  return clip_line(ex, ey, sx, sy, maxx);
2010 
2011  if (*sx < 0) {
2012  if (*ex < 0)
2013  return 1;
2014  *sy = *ey + (*sy - *ey) * (int64_t)*ex / (*ex - *sx);
2015  *sx = 0;
2016  }
2017 
2018  if (*ex > maxx) {
2019  if (*sx > maxx)
2020  return 1;
2021  *ey = *sy + (*ey - *sy) * (int64_t)(maxx - *sx) / (*ex - *sx);
2022  *ex = maxx;
2023  }
2024  return 0;
2025 }
2026 
2027 
2028 /**
2029  * Draw a line from (ex, ey) -> (sx, sy).
2030  * @param w width of the image
2031  * @param h height of the image
2032  * @param stride stride/linesize of the image
2033  * @param color color of the arrow
2034  */
2035 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
2036  int w, int h, int stride, int color)
2037 {
2038  int x, y, fr, f;
2039 
2040  if (clip_line(&sx, &sy, &ex, &ey, w - 1))
2041  return;
2042  if (clip_line(&sy, &sx, &ey, &ex, h - 1))
2043  return;
2044 
2045  sx = av_clip(sx, 0, w - 1);
2046  sy = av_clip(sy, 0, h - 1);
2047  ex = av_clip(ex, 0, w - 1);
2048  ey = av_clip(ey, 0, h - 1);
2049 
2050  buf[sy * stride + sx] += color;
2051 
2052  if (FFABS(ex - sx) > FFABS(ey - sy)) {
2053  if (sx > ex) {
2054  FFSWAP(int, sx, ex);
2055  FFSWAP(int, sy, ey);
2056  }
2057  buf += sx + sy * stride;
2058  ex -= sx;
2059  f = ((ey - sy) << 16) / ex;
2060  for (x = 0; x <= ex; x++) {
2061  y = (x * f) >> 16;
2062  fr = (x * f) & 0xFFFF;
2063  buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
2064  if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
2065  }
2066  } else {
2067  if (sy > ey) {
2068  FFSWAP(int, sx, ex);
2069  FFSWAP(int, sy, ey);
2070  }
2071  buf += sx + sy * stride;
2072  ey -= sy;
2073  if (ey)
2074  f = ((ex - sx) << 16) / ey;
2075  else
2076  f = 0;
2077  for(y= 0; y <= ey; y++){
2078  x = (y*f) >> 16;
2079  fr = (y*f) & 0xFFFF;
2080  buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
2081  if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
2082  }
2083  }
2084 }
2085 
2086 /**
2087  * Draw an arrow from (ex, ey) -> (sx, sy).
2088  * @param w width of the image
2089  * @param h height of the image
2090  * @param stride stride/linesize of the image
2091  * @param color color of the arrow
2092  */
2093 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
2094  int ey, int w, int h, int stride, int color, int tail, int direction)
2095 {
2096  int dx,dy;
2097 
2098  if (direction) {
2099  FFSWAP(int, sx, ex);
2100  FFSWAP(int, sy, ey);
2101  }
2102 
2103  sx = av_clip(sx, -100, w + 100);
2104  sy = av_clip(sy, -100, h + 100);
2105  ex = av_clip(ex, -100, w + 100);
2106  ey = av_clip(ey, -100, h + 100);
2107 
2108  dx = ex - sx;
2109  dy = ey - sy;
2110 
2111  if (dx * dx + dy * dy > 3 * 3) {
2112  int rx = dx + dy;
2113  int ry = -dx + dy;
2114  int length = ff_sqrt((rx * rx + ry * ry) << 8);
2115 
2116  // FIXME subpixel accuracy
2117  rx = ROUNDED_DIV(rx * 3 << 4, length);
2118  ry = ROUNDED_DIV(ry * 3 << 4, length);
2119 
2120  if (tail) {
2121  rx = -rx;
2122  ry = -ry;
2123  }
2124 
2125  draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
2126  draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
2127  }
2128  draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
2129 }
2130 #endif
2131 
2132 static int add_mb(AVMotionVector *mb, uint32_t mb_type,
2133  int dst_x, int dst_y,
2134  int src_x, int src_y,
2135  int direction)
2136 {
2137  mb->w = IS_8X8(mb_type) || IS_8X16(mb_type) ? 8 : 16;
2138  mb->h = IS_8X8(mb_type) || IS_16X8(mb_type) ? 8 : 16;
2139  mb->src_x = src_x;
2140  mb->src_y = src_y;
2141  mb->dst_x = dst_x;
2142  mb->dst_y = dst_y;
2143  mb->source = direction ? 1 : -1;
2144  mb->flags = 0; // XXX: does mb_type contain extra information that could be exported here?
2145  return 1;
2146 }
2147 
2148 /**
2149  * Print debugging info for the given picture.
2150  */
2151 void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_table,
2152  uint32_t *mbtype_table, int8_t *qscale_table, int16_t (*motion_val[2])[2],
2153  int *low_delay,
2154  int mb_width, int mb_height, int mb_stride, int quarter_sample)
2155 {
2156  if ((avctx->flags2 & CODEC_FLAG2_EXPORT_MVS) && mbtype_table && motion_val[0]) {
2157  const int shift = 1 + quarter_sample;
2158  const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_SVQ3 ? 2 : 1;
2159  const int mv_stride = (mb_width << mv_sample_log2) +
2160  (avctx->codec->id == AV_CODEC_ID_H264 ? 0 : 1);
2161  int mb_x, mb_y, mbcount = 0;
2162 
2163  /* size is width * height * 2 * 4 where 2 is for directions and 4 is
2164  * for the maximum number of MB (4 MB in case of IS_8x8) */
2165  AVMotionVector *mvs = av_malloc_array(mb_width * mb_height, 2 * 4 * sizeof(AVMotionVector));
2166  if (!mvs)
2167  return;
2168 
2169  for (mb_y = 0; mb_y < mb_height; mb_y++) {
2170  for (mb_x = 0; mb_x < mb_width; mb_x++) {
2171  int i, direction, mb_type = mbtype_table[mb_x + mb_y * mb_stride];
2172  for (direction = 0; direction < 2; direction++) {
2173  if (!USES_LIST(mb_type, direction))
2174  continue;
2175  if (IS_8X8(mb_type)) {
2176  for (i = 0; i < 4; i++) {
2177  int sx = mb_x * 16 + 4 + 8 * (i & 1);
2178  int sy = mb_y * 16 + 4 + 8 * (i >> 1);
2179  int xy = (mb_x * 2 + (i & 1) +
2180  (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
2181  int mx = (motion_val[direction][xy][0] >> shift) + sx;
2182  int my = (motion_val[direction][xy][1] >> shift) + sy;
2183  mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, direction);
2184  }
2185  } else if (IS_16X8(mb_type)) {
2186  for (i = 0; i < 2; i++) {
2187  int sx = mb_x * 16 + 8;
2188  int sy = mb_y * 16 + 4 + 8 * i;
2189  int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
2190  int mx = (motion_val[direction][xy][0] >> shift);
2191  int my = (motion_val[direction][xy][1] >> shift);
2192 
2193  if (IS_INTERLACED(mb_type))
2194  my *= 2;
2195 
2196  mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx + sx, my + sy, direction);
2197  }
2198  } else if (IS_8X16(mb_type)) {
2199  for (i = 0; i < 2; i++) {
2200  int sx = mb_x * 16 + 4 + 8 * i;
2201  int sy = mb_y * 16 + 8;
2202  int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
2203  int mx = motion_val[direction][xy][0] >> shift;
2204  int my = motion_val[direction][xy][1] >> shift;
2205 
2206  if (IS_INTERLACED(mb_type))
2207  my *= 2;
2208 
2209  mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx + sx, my + sy, direction);
2210  }
2211  } else {
2212  int sx = mb_x * 16 + 8;
2213  int sy = mb_y * 16 + 8;
2214  int xy = (mb_x + mb_y * mv_stride) << mv_sample_log2;
2215  int mx = (motion_val[direction][xy][0]>>shift) + sx;
2216  int my = (motion_val[direction][xy][1]>>shift) + sy;
2217  mbcount += add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, direction);
2218  }
2219  }
2220  }
2221  }
2222 
2223  if (mbcount) {
2224  AVFrameSideData *sd;
2225 
2226  av_log(avctx, AV_LOG_DEBUG, "Adding %d MVs info to frame %d\n", mbcount, avctx->frame_number);
2228  if (!sd) {
2229  av_freep(&mvs);
2230  return;
2231  }
2232  memcpy(sd->data, mvs, mbcount * sizeof(AVMotionVector));
2233  }
2234 
2235  av_freep(&mvs);
2236  }
2237 
2238  /* TODO: export all the following to make them accessible for users (and filters) */
2239  if (avctx->hwaccel || !mbtype_table
2241  return;
2242 
2243 
2244  if (avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
2245  int x,y;
2246 
2247  av_log(avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
2249  for (y = 0; y < mb_height; y++) {
2250  for (x = 0; x < mb_width; x++) {
2251  if (avctx->debug & FF_DEBUG_SKIP) {
2252  int count = mbskip_table[x + y * mb_stride];
2253  if (count > 9)
2254  count = 9;
2255  av_log(avctx, AV_LOG_DEBUG, "%1d", count);
2256  }
2257  if (avctx->debug & FF_DEBUG_QP) {
2258  av_log(avctx, AV_LOG_DEBUG, "%2d",
2259  qscale_table[x + y * mb_stride]);
2260  }
2261  if (avctx->debug & FF_DEBUG_MB_TYPE) {
2262  int mb_type = mbtype_table[x + y * mb_stride];
2263  // Type & MV direction
2264  if (IS_PCM(mb_type))
2265  av_log(avctx, AV_LOG_DEBUG, "P");
2266  else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
2267  av_log(avctx, AV_LOG_DEBUG, "A");
2268  else if (IS_INTRA4x4(mb_type))
2269  av_log(avctx, AV_LOG_DEBUG, "i");
2270  else if (IS_INTRA16x16(mb_type))
2271  av_log(avctx, AV_LOG_DEBUG, "I");
2272  else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
2273  av_log(avctx, AV_LOG_DEBUG, "d");
2274  else if (IS_DIRECT(mb_type))
2275  av_log(avctx, AV_LOG_DEBUG, "D");
2276  else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
2277  av_log(avctx, AV_LOG_DEBUG, "g");
2278  else if (IS_GMC(mb_type))
2279  av_log(avctx, AV_LOG_DEBUG, "G");
2280  else if (IS_SKIP(mb_type))
2281  av_log(avctx, AV_LOG_DEBUG, "S");
2282  else if (!USES_LIST(mb_type, 1))
2283  av_log(avctx, AV_LOG_DEBUG, ">");
2284  else if (!USES_LIST(mb_type, 0))
2285  av_log(avctx, AV_LOG_DEBUG, "<");
2286  else {
2287  av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
2288  av_log(avctx, AV_LOG_DEBUG, "X");
2289  }
2290 
2291  // segmentation
2292  if (IS_8X8(mb_type))
2293  av_log(avctx, AV_LOG_DEBUG, "+");
2294  else if (IS_16X8(mb_type))
2295  av_log(avctx, AV_LOG_DEBUG, "-");
2296  else if (IS_8X16(mb_type))
2297  av_log(avctx, AV_LOG_DEBUG, "|");
2298  else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
2299  av_log(avctx, AV_LOG_DEBUG, " ");
2300  else
2301  av_log(avctx, AV_LOG_DEBUG, "?");
2302 
2303 
2304  if (IS_INTERLACED(mb_type))
2305  av_log(avctx, AV_LOG_DEBUG, "=");
2306  else
2307  av_log(avctx, AV_LOG_DEBUG, " ");
2308  }
2309  }
2310  av_log(avctx, AV_LOG_DEBUG, "\n");
2311  }
2312  }
2313 
2314  if ((avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
2315  (avctx->debug_mv)) {
2316  int mb_y;
2317  int i;
2318  int h_chroma_shift, v_chroma_shift, block_height;
2319 #if FF_API_VISMV
2320  const int shift = 1 + quarter_sample;
2321  uint8_t *ptr;
2322  const int width = avctx->width;
2323  const int height = avctx->height;
2324 #endif
2325  const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_SVQ3 ? 2 : 1;
2326  const int mv_stride = (mb_width << mv_sample_log2) +
2327  (avctx->codec->id == AV_CODEC_ID_H264 ? 0 : 1);
2328 
2329  *low_delay = 0; // needed to see the vectors without trashing the buffers
2330 
2331  avcodec_get_chroma_sub_sample(avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2332 
2333  av_frame_make_writable(pict);
2334 
2335  pict->opaque = NULL;
2336 #if FF_API_VISMV
2337  ptr = pict->data[0];
2338 #endif
2339  block_height = 16 >> v_chroma_shift;
2340 
2341  for (mb_y = 0; mb_y < mb_height; mb_y++) {
2342  int mb_x;
2343  for (mb_x = 0; mb_x < mb_width; mb_x++) {
2344  const int mb_index = mb_x + mb_y * mb_stride;
2345 #if FF_API_VISMV
2346  if ((avctx->debug_mv) && motion_val[0]) {
2347  int type;
2348  for (type = 0; type < 3; type++) {
2349  int direction = 0;
2350  switch (type) {
2351  case 0:
2352  if ((!(avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
2353  (pict->pict_type!= AV_PICTURE_TYPE_P))
2354  continue;
2355  direction = 0;
2356  break;
2357  case 1:
2358  if ((!(avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
2359  (pict->pict_type!= AV_PICTURE_TYPE_B))
2360  continue;
2361  direction = 0;
2362  break;
2363  case 2:
2364  if ((!(avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
2365  (pict->pict_type!= AV_PICTURE_TYPE_B))
2366  continue;
2367  direction = 1;
2368  break;
2369  }
2370  if (!USES_LIST(mbtype_table[mb_index], direction))
2371  continue;
2372 
2373  if (IS_8X8(mbtype_table[mb_index])) {
2374  int i;
2375  for (i = 0; i < 4; i++) {
2376  int sx = mb_x * 16 + 4 + 8 * (i & 1);
2377  int sy = mb_y * 16 + 4 + 8 * (i >> 1);
2378  int xy = (mb_x * 2 + (i & 1) +
2379  (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
2380  int mx = (motion_val[direction][xy][0] >> shift) + sx;
2381  int my = (motion_val[direction][xy][1] >> shift) + sy;
2382  draw_arrow(ptr, sx, sy, mx, my, width,
2383  height, pict->linesize[0], 100, 0, direction);
2384  }
2385  } else if (IS_16X8(mbtype_table[mb_index])) {
2386  int i;
2387  for (i = 0; i < 2; i++) {
2388  int sx = mb_x * 16 + 8;
2389  int sy = mb_y * 16 + 4 + 8 * i;
2390  int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
2391  int mx = (motion_val[direction][xy][0] >> shift);
2392  int my = (motion_val[direction][xy][1] >> shift);
2393 
2394  if (IS_INTERLACED(mbtype_table[mb_index]))
2395  my *= 2;
2396 
2397  draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
2398  height, pict->linesize[0], 100, 0, direction);
2399  }
2400  } else if (IS_8X16(mbtype_table[mb_index])) {
2401  int i;
2402  for (i = 0; i < 2; i++) {
2403  int sx = mb_x * 16 + 4 + 8 * i;
2404  int sy = mb_y * 16 + 8;
2405  int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
2406  int mx = motion_val[direction][xy][0] >> shift;
2407  int my = motion_val[direction][xy][1] >> shift;
2408 
2409  if (IS_INTERLACED(mbtype_table[mb_index]))
2410  my *= 2;
2411 
2412  draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
2413  height, pict->linesize[0], 100, 0, direction);
2414  }
2415  } else {
2416  int sx= mb_x * 16 + 8;
2417  int sy= mb_y * 16 + 8;
2418  int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
2419  int mx= (motion_val[direction][xy][0]>>shift) + sx;
2420  int my= (motion_val[direction][xy][1]>>shift) + sy;
2421  draw_arrow(ptr, sx, sy, mx, my, width, height, pict->linesize[0], 100, 0, direction);
2422  }
2423  }
2424  }
2425 #endif
2426  if ((avctx->debug & FF_DEBUG_VIS_QP)) {
2427  uint64_t c = (qscale_table[mb_index] * 128 / 31) *
2428  0x0101010101010101ULL;
2429  int y;
2430  for (y = 0; y < block_height; y++) {
2431  *(uint64_t *)(pict->data[1] + 8 * mb_x +
2432  (block_height * mb_y + y) *
2433  pict->linesize[1]) = c;
2434  *(uint64_t *)(pict->data[2] + 8 * mb_x +
2435  (block_height * mb_y + y) *
2436  pict->linesize[2]) = c;
2437  }
2438  }
2439  if ((avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
2440  motion_val[0]) {
2441  int mb_type = mbtype_table[mb_index];
2442  uint64_t u,v;
2443  int y;
2444 #define COLOR(theta, r) \
2445  u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
2446  v = (int)(128 + r * sin(theta * 3.141592 / 180));
2447 
2448 
2449  u = v = 128;
2450  if (IS_PCM(mb_type)) {
2451  COLOR(120, 48)
2452  } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
2453  IS_INTRA16x16(mb_type)) {
2454  COLOR(30, 48)
2455  } else if (IS_INTRA4x4(mb_type)) {
2456  COLOR(90, 48)
2457  } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
2458  // COLOR(120, 48)
2459  } else if (IS_DIRECT(mb_type)) {
2460  COLOR(150, 48)
2461  } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
2462  COLOR(170, 48)
2463  } else if (IS_GMC(mb_type)) {
2464  COLOR(190, 48)
2465  } else if (IS_SKIP(mb_type)) {
2466  // COLOR(180, 48)
2467  } else if (!USES_LIST(mb_type, 1)) {
2468  COLOR(240, 48)
2469  } else if (!USES_LIST(mb_type, 0)) {
2470  COLOR(0, 48)
2471  } else {
2472  av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
2473  COLOR(300,48)
2474  }
2475 
2476  u *= 0x0101010101010101ULL;
2477  v *= 0x0101010101010101ULL;
2478  for (y = 0; y < block_height; y++) {
2479  *(uint64_t *)(pict->data[1] + 8 * mb_x +
2480  (block_height * mb_y + y) * pict->linesize[1]) = u;
2481  *(uint64_t *)(pict->data[2] + 8 * mb_x +
2482  (block_height * mb_y + y) * pict->linesize[2]) = v;
2483  }
2484 
2485  // segmentation
2486  if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
2487  *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
2488  (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
2489  *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
2490  (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
2491  }
2492  if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
2493  for (y = 0; y < 16; y++)
2494  pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
2495  pict->linesize[0]] ^= 0x80;
2496  }
2497  if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
2498  int dm = 1 << (mv_sample_log2 - 2);
2499  for (i = 0; i < 4; i++) {
2500  int sx = mb_x * 16 + 8 * (i & 1);
2501  int sy = mb_y * 16 + 8 * (i >> 1);
2502  int xy = (mb_x * 2 + (i & 1) +
2503  (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
2504  // FIXME bidir
2505  int32_t *mv = (int32_t *) &motion_val[0][xy];
2506  if (mv[0] != mv[dm] ||
2507  mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
2508  for (y = 0; y < 8; y++)
2509  pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
2510  if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
2511  *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
2512  pict->linesize[0]) ^= 0x8080808080808080ULL;
2513  }
2514  }
2515 
2516  if (IS_INTERLACED(mb_type) &&
2517  avctx->codec->id == AV_CODEC_ID_H264) {
2518  // hmm
2519  }
2520  }
2521  mbskip_table[mb_index] = 0;
2522  }
2523  }
2524  }
2525 }
2526 
2528 {
2530  p->qscale_table, p->motion_val, &s->low_delay,
2531  s->mb_width, s->mb_height, s->mb_stride, s->quarter_sample);
2532 }
2533 
2535 {
2537  int offset = 2*s->mb_stride + 1;
2538  if(!ref)
2539  return AVERROR(ENOMEM);
2540  av_assert0(ref->size >= offset + s->mb_stride * ((f->height+15)/16));
2541  ref->size -= offset;
2542  ref->data += offset;
2543  return av_frame_set_qp_table(f, ref, s->mb_stride, qp_type);
2544 }
2545 
2547  uint8_t *dest, uint8_t *src,
2548  int field_based, int field_select,
2549  int src_x, int src_y,
2550  int width, int height, ptrdiff_t stride,
2551  int h_edge_pos, int v_edge_pos,
2552  int w, int h, h264_chroma_mc_func *pix_op,
2553  int motion_x, int motion_y)
2554 {
2555  const int lowres = s->avctx->lowres;
2556  const int op_index = FFMIN(lowres, 3);
2557  const int s_mask = (2 << lowres) - 1;
2558  int emu = 0;
2559  int sx, sy;
2560 
2561  if (s->quarter_sample) {
2562  motion_x /= 2;
2563  motion_y /= 2;
2564  }
2565 
2566  sx = motion_x & s_mask;
2567  sy = motion_y & s_mask;
2568  src_x += motion_x >> lowres + 1;
2569  src_y += motion_y >> lowres + 1;
2570 
2571  src += src_y * stride + src_x;
2572 
2573  if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
2574  (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2576  s->linesize, s->linesize,
2577  w + 1, (h + 1) << field_based,
2578  src_x, src_y << field_based,
2579  h_edge_pos, v_edge_pos);
2580  src = s->edge_emu_buffer;
2581  emu = 1;
2582  }
2583 
2584  sx = (sx << 2) >> lowres;
2585  sy = (sy << 2) >> lowres;
2586  if (field_select)
2587  src += s->linesize;
2588  pix_op[op_index](dest, src, stride, h, sx, sy);
2589  return emu;
2590 }
2591 
2592 /* apply one mpeg motion vector to the three components */
2594  uint8_t *dest_y,
2595  uint8_t *dest_cb,
2596  uint8_t *dest_cr,
2597  int field_based,
2598  int bottom_field,
2599  int field_select,
2600  uint8_t **ref_picture,
2601  h264_chroma_mc_func *pix_op,
2602  int motion_x, int motion_y,
2603  int h, int mb_y)
2604 {
2605  uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2606  int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, sx, sy, uvsx, uvsy;
2607  ptrdiff_t uvlinesize, linesize;
2608  const int lowres = s->avctx->lowres;
2609  const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 3);
2610  const int block_s = 8>>lowres;
2611  const int s_mask = (2 << lowres) - 1;
2612  const int h_edge_pos = s->h_edge_pos >> lowres;
2613  const int v_edge_pos = s->v_edge_pos >> lowres;
2614  linesize = s->current_picture.f->linesize[0] << field_based;
2615  uvlinesize = s->current_picture.f->linesize[1] << field_based;
2616 
2617  // FIXME obviously not perfect but qpel will not work in lowres anyway
2618  if (s->quarter_sample) {
2619  motion_x /= 2;
2620  motion_y /= 2;
2621  }
2622 
2623  if(field_based){
2624  motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2625  }
2626 
2627  sx = motion_x & s_mask;
2628  sy = motion_y & s_mask;
2629  src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2630  src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2631 
2632  if (s->out_format == FMT_H263) {
2633  uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2634  uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2635  uvsrc_x = src_x >> 1;
2636  uvsrc_y = src_y >> 1;
2637  } else if (s->out_format == FMT_H261) {
2638  // even chroma mv's are full pel in H261
2639  mx = motion_x / 4;
2640  my = motion_y / 4;
2641  uvsx = (2 * mx) & s_mask;
2642  uvsy = (2 * my) & s_mask;
2643  uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2644  uvsrc_y = mb_y * block_s + (my >> lowres);
2645  } else {
2646  if(s->chroma_y_shift){
2647  mx = motion_x / 2;
2648  my = motion_y / 2;
2649  uvsx = mx & s_mask;
2650  uvsy = my & s_mask;
2651  uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2652  uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2653  } else {
2654  if(s->chroma_x_shift){
2655  //Chroma422
2656  mx = motion_x / 2;
2657  uvsx = mx & s_mask;
2658  uvsy = motion_y & s_mask;
2659  uvsrc_y = src_y;
2660  uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2661  } else {
2662  //Chroma444
2663  uvsx = motion_x & s_mask;
2664  uvsy = motion_y & s_mask;
2665  uvsrc_x = src_x;
2666  uvsrc_y = src_y;
2667  }
2668  }
2669  }
2670 
2671  ptr_y = ref_picture[0] + src_y * linesize + src_x;
2672  ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2673  ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2674 
2675  if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) || uvsrc_y<0 ||
2676  (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2677  s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2678  linesize >> field_based, linesize >> field_based,
2679  17, 17 + field_based,
2680  src_x, src_y << field_based, h_edge_pos,
2681  v_edge_pos);
2682  ptr_y = s->edge_emu_buffer;
2683  if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2684  uint8_t *ubuf = s->edge_emu_buffer + 18 * s->linesize;
2685  uint8_t *vbuf =ubuf + 9 * s->uvlinesize;
2686  s->vdsp.emulated_edge_mc(ubuf, ptr_cb,
2687  uvlinesize >> field_based, uvlinesize >> field_based,
2688  9, 9 + field_based,
2689  uvsrc_x, uvsrc_y << field_based,
2690  h_edge_pos >> 1, v_edge_pos >> 1);
2691  s->vdsp.emulated_edge_mc(vbuf, ptr_cr,
2692  uvlinesize >> field_based,uvlinesize >> field_based,
2693  9, 9 + field_based,
2694  uvsrc_x, uvsrc_y << field_based,
2695  h_edge_pos >> 1, v_edge_pos >> 1);
2696  ptr_cb = ubuf;
2697  ptr_cr = vbuf;
2698  }
2699  }
2700 
2701  // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f->data
2702  if (bottom_field) {
2703  dest_y += s->linesize;
2704  dest_cb += s->uvlinesize;
2705  dest_cr += s->uvlinesize;
2706  }
2707 
2708  if (field_select) {
2709  ptr_y += s->linesize;
2710  ptr_cb += s->uvlinesize;
2711  ptr_cr += s->uvlinesize;
2712  }
2713 
2714  sx = (sx << 2) >> lowres;
2715  sy = (sy << 2) >> lowres;
2716  pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2717 
2718  if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2719  int hc = s->chroma_y_shift ? (h+1-bottom_field)>>1 : h;
2720  uvsx = (uvsx << 2) >> lowres;
2721  uvsy = (uvsy << 2) >> lowres;
2722  if (hc) {
2723  pix_op[op_index](dest_cb, ptr_cb, uvlinesize, hc, uvsx, uvsy);
2724  pix_op[op_index](dest_cr, ptr_cr, uvlinesize, hc, uvsx, uvsy);
2725  }
2726  }
2727  // FIXME h261 lowres loop filter
2728 }
2729 
2731  uint8_t *dest_cb, uint8_t *dest_cr,
2732  uint8_t **ref_picture,
2733  h264_chroma_mc_func * pix_op,
2734  int mx, int my)
2735 {
2736  const int lowres = s->avctx->lowres;
2737  const int op_index = FFMIN(lowres, 3);
2738  const int block_s = 8 >> lowres;
2739  const int s_mask = (2 << lowres) - 1;
2740  const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2741  const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2742  int emu = 0, src_x, src_y, sx, sy;
2743  ptrdiff_t offset;
2744  uint8_t *ptr;
2745 
2746  if (s->quarter_sample) {
2747  mx /= 2;
2748  my /= 2;
2749  }
2750 
2751  /* In case of 8X8, we construct a single chroma motion vector
2752  with a special rounding */
2753  mx = ff_h263_round_chroma(mx);
2754  my = ff_h263_round_chroma(my);
2755 
2756  sx = mx & s_mask;
2757  sy = my & s_mask;
2758  src_x = s->mb_x * block_s + (mx >> lowres + 1);
2759  src_y = s->mb_y * block_s + (my >> lowres + 1);
2760 
2761  offset = src_y * s->uvlinesize + src_x;
2762  ptr = ref_picture[1] + offset;
2763  if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2764  (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2766  s->uvlinesize, s->uvlinesize,
2767  9, 9,
2768  src_x, src_y, h_edge_pos, v_edge_pos);
2769  ptr = s->edge_emu_buffer;
2770  emu = 1;
2771  }
2772  sx = (sx << 2) >> lowres;
2773  sy = (sy << 2) >> lowres;
2774  pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2775 
2776  ptr = ref_picture[2] + offset;
2777  if (emu) {
2779  s->uvlinesize, s->uvlinesize,
2780  9, 9,
2781  src_x, src_y, h_edge_pos, v_edge_pos);
2782  ptr = s->edge_emu_buffer;
2783  }
2784  pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2785 }
2786 
2787 /**
2788  * motion compensation of a single macroblock
2789  * @param s context
2790  * @param dest_y luma destination pointer
2791  * @param dest_cb chroma cb/u destination pointer
2792  * @param dest_cr chroma cr/v destination pointer
2793  * @param dir direction (0->forward, 1->backward)
2794  * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2795  * @param pix_op halfpel motion compensation function (average or put normally)
2796  * the motion vectors are taken from s->mv and the MV type from s->mv_type
2797  */
2798 static inline void MPV_motion_lowres(MpegEncContext *s,
2799  uint8_t *dest_y, uint8_t *dest_cb,
2800  uint8_t *dest_cr,
2801  int dir, uint8_t **ref_picture,
2802  h264_chroma_mc_func *pix_op)
2803 {
2804  int mx, my;
2805  int mb_x, mb_y, i;
2806  const int lowres = s->avctx->lowres;
2807  const int block_s = 8 >>lowres;
2808 
2809  mb_x = s->mb_x;
2810  mb_y = s->mb_y;
2811 
2812  switch (s->mv_type) {
2813  case MV_TYPE_16X16:
2814  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2815  0, 0, 0,
2816  ref_picture, pix_op,
2817  s->mv[dir][0][0], s->mv[dir][0][1],
2818  2 * block_s, mb_y);
2819  break;
2820  case MV_TYPE_8X8:
2821  mx = 0;
2822  my = 0;
2823  for (i = 0; i < 4; i++) {
2824  hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2825  s->linesize) * block_s,
2826  ref_picture[0], 0, 0,
2827  (2 * mb_x + (i & 1)) * block_s,
2828  (2 * mb_y + (i >> 1)) * block_s,
2829  s->width, s->height, s->linesize,
2830  s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2831  block_s, block_s, pix_op,
2832  s->mv[dir][i][0], s->mv[dir][i][1]);
2833 
2834  mx += s->mv[dir][i][0];
2835  my += s->mv[dir][i][1];
2836  }
2837 
2838  if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2839  chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2840  pix_op, mx, my);
2841  break;
2842  case MV_TYPE_FIELD:
2843  if (s->picture_structure == PICT_FRAME) {
2844  /* top field */
2845  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2846  1, 0, s->field_select[dir][0],
2847  ref_picture, pix_op,
2848  s->mv[dir][0][0], s->mv[dir][0][1],
2849  block_s, mb_y);
2850  /* bottom field */
2851  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2852  1, 1, s->field_select[dir][1],
2853  ref_picture, pix_op,
2854  s->mv[dir][1][0], s->mv[dir][1][1],
2855  block_s, mb_y);
2856  } else {
2857  if (s->picture_structure != s->field_select[dir][0] + 1 &&
2858  s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2859  ref_picture = s->current_picture_ptr->f->data;
2860 
2861  }
2862  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2863  0, 0, s->field_select[dir][0],
2864  ref_picture, pix_op,
2865  s->mv[dir][0][0],
2866  s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2867  }
2868  break;
2869  case MV_TYPE_16X8:
2870  for (i = 0; i < 2; i++) {
2871  uint8_t **ref2picture;
2872 
2873  if (s->picture_structure == s->field_select[dir][i] + 1 ||
2874  s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2875  ref2picture = ref_picture;
2876  } else {
2877  ref2picture = s->current_picture_ptr->f->data;
2878  }
2879 
2880  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2881  0, 0, s->field_select[dir][i],
2882  ref2picture, pix_op,
2883  s->mv[dir][i][0], s->mv[dir][i][1] +
2884  2 * block_s * i, block_s, mb_y >> 1);
2885 
2886  dest_y += 2 * block_s * s->linesize;
2887  dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2888  dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2889  }
2890  break;
2891  case MV_TYPE_DMV:
2892  if (s->picture_structure == PICT_FRAME) {
2893  for (i = 0; i < 2; i++) {
2894  int j;
2895  for (j = 0; j < 2; j++) {
2896  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2897  1, j, j ^ i,
2898  ref_picture, pix_op,
2899  s->mv[dir][2 * i + j][0],
2900  s->mv[dir][2 * i + j][1],
2901  block_s, mb_y);
2902  }
2904  }
2905  } else {
2906  for (i = 0; i < 2; i++) {
2907  mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2908  0, 0, s->picture_structure != i + 1,
2909  ref_picture, pix_op,
2910  s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2911  2 * block_s, mb_y >> 1);
2912 
2913  // after put we make avg of the same block
2915 
2916  // opposite parity is always in the same
2917  // frame if this is second field
2918  if (!s->first_field) {
2919  ref_picture = s->current_picture_ptr->f->data;
2920  }
2921  }
2922  }
2923  break;
2924  default:
2925  av_assert2(0);
2926  }
2927 }
2928 
2929 /**
2930  * find the lowest MB row referenced in the MVs
2931  */
2933 {
2934  int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2935  int my, off, i, mvs;
2936 
2937  if (s->picture_structure != PICT_FRAME || s->mcsel)
2938  goto unhandled;
2939 
2940  switch (s->mv_type) {
2941  case MV_TYPE_16X16:
2942  mvs = 1;
2943  break;
2944  case MV_TYPE_16X8:
2945  mvs = 2;
2946  break;
2947  case MV_TYPE_8X8:
2948  mvs = 4;
2949  break;
2950  default:
2951  goto unhandled;
2952  }
2953 
2954  for (i = 0; i < mvs; i++) {
2955  my = s->mv[dir][i][1]<<qpel_shift;
2956  my_max = FFMAX(my_max, my);
2957  my_min = FFMIN(my_min, my);
2958  }
2959 
2960  off = (FFMAX(-my_min, my_max) + 63) >> 6;
2961 
2962  return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2963 unhandled:
2964  return s->mb_height-1;
2965 }
2966 
2967 /* put block[] to dest[] */
2968 static inline void put_dct(MpegEncContext *s,
2969  int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
2970 {
2971  s->dct_unquantize_intra(s, block, i, qscale);
2972  s->idsp.idct_put(dest, line_size, block);
2973 }
2974 
2975 /* add block[] to dest[] */
2976 static inline void add_dct(MpegEncContext *s,
2977  int16_t *block, int i, uint8_t *dest, int line_size)
2978 {
2979  if (s->block_last_index[i] >= 0) {
2980  s->idsp.idct_add(dest, line_size, block);
2981  }
2982 }
2983 
2984 static inline void add_dequant_dct(MpegEncContext *s,
2985  int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
2986 {
2987  if (s->block_last_index[i] >= 0) {
2988  s->dct_unquantize_inter(s, block, i, qscale);
2989 
2990  s->idsp.idct_add(dest, line_size, block);
2991  }
2992 }
2993 
2994 /**
2995  * Clean dc, ac, coded_block for the current non-intra MB.
2996  */
2998 {
2999  int wrap = s->b8_stride;
3000  int xy = s->block_index[0];
3001 
3002  s->dc_val[0][xy ] =
3003  s->dc_val[0][xy + 1 ] =
3004  s->dc_val[0][xy + wrap] =
3005  s->dc_val[0][xy + 1 + wrap] = 1024;
3006  /* ac pred */
3007  memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3008  memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3009  if (s->msmpeg4_version>=3) {
3010  s->coded_block[xy ] =
3011  s->coded_block[xy + 1 ] =
3012  s->coded_block[xy + wrap] =
3013  s->coded_block[xy + 1 + wrap] = 0;
3014  }
3015  /* chroma */
3016  wrap = s->mb_stride;
3017  xy = s->mb_x + s->mb_y * wrap;
3018  s->dc_val[1][xy] =
3019  s->dc_val[2][xy] = 1024;
3020  /* ac pred */
3021  memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3022  memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3023 
3024  s->mbintra_table[xy]= 0;
3025 }
3026 
3027 /* generic function called after a macroblock has been parsed by the
3028  decoder or after it has been encoded by the encoder.
3029 
3030  Important variables used:
3031  s->mb_intra : true if intra macroblock
3032  s->mv_dir : motion vector direction
3033  s->mv_type : motion vector type
3034  s->mv : motion vector
3035  s->interlaced_dct : true if interlaced dct used (mpeg2)
3036  */
3037 static av_always_inline
3039  int lowres_flag, int is_mpeg12)
3040 {
3041  const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3042 
3043  if (CONFIG_XVMC &&
3044  s->avctx->hwaccel && s->avctx->hwaccel->decode_mb) {
3045  s->avctx->hwaccel->decode_mb(s);//xvmc uses pblocks
3046  return;
3047  }
3048 
3049  if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3050  /* print DCT coefficients */
3051  int i,j;
3052  av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
3053  for(i=0; i<6; i++){
3054  for(j=0; j<64; j++){
3055  av_log(s->avctx, AV_LOG_DEBUG, "%5d",
3056  block[i][s->idsp.idct_permutation[j]]);
3057  }
3058  av_log(s->avctx, AV_LOG_DEBUG, "\n");
3059  }
3060  }
3061 
3062  s->current_picture.qscale_table[mb_xy] = s->qscale;
3063 
3064  /* update DC predictors for P macroblocks */
3065  if (!s->mb_intra) {
3066  if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
3067  if(s->mbintra_table[mb_xy])
3069  } else {
3070  s->last_dc[0] =
3071  s->last_dc[1] =
3072  s->last_dc[2] = 128 << s->intra_dc_precision;
3073  }
3074  }
3075  else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
3076  s->mbintra_table[mb_xy]=1;
3077 
3078  if ( (s->flags&CODEC_FLAG_PSNR)
3080  || !(s->encoding && (s->intra_only || s->pict_type==AV_PICTURE_TYPE_B) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
3081  uint8_t *dest_y, *dest_cb, *dest_cr;
3082  int dct_linesize, dct_offset;
3083  op_pixels_func (*op_pix)[4];
3084  qpel_mc_func (*op_qpix)[16];
3085  const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics
3086  const int uvlinesize = s->current_picture.f->linesize[1];
3087  const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3088  const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3089 
3090  /* avoid copy if macroblock skipped in last frame too */
3091  /* skip only during decoding as we might trash the buffers during encoding a bit */
3092  if(!s->encoding){
3093  uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3094 
3095  if (s->mb_skipped) {
3096  s->mb_skipped= 0;
3098  *mbskip_ptr = 1;
3099  } else if(!s->current_picture.reference) {
3100  *mbskip_ptr = 1;
3101  } else{
3102  *mbskip_ptr = 0; /* not skipped */
3103  }
3104  }
3105 
3106  dct_linesize = linesize << s->interlaced_dct;
3107  dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
3108 
3109  if(readable){
3110  dest_y= s->dest[0];
3111  dest_cb= s->dest[1];
3112  dest_cr= s->dest[2];
3113  }else{
3114  dest_y = s->b_scratchpad;
3115  dest_cb= s->b_scratchpad+16*linesize;
3116  dest_cr= s->b_scratchpad+32*linesize;
3117  }
3118 
3119  if (!s->mb_intra) {
3120  /* motion handling */
3121  /* decoding or more than one mb_type (MC was already done otherwise) */
3122  if(!s->encoding){
3123 
3124  if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
3125  if (s->mv_dir & MV_DIR_FORWARD) {
3128  0);
3129  }
3130  if (s->mv_dir & MV_DIR_BACKWARD) {
3133  0);
3134  }
3135  }
3136 
3137  if(lowres_flag){
3139 
3140  if (s->mv_dir & MV_DIR_FORWARD) {
3141  MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix);
3143  }
3144  if (s->mv_dir & MV_DIR_BACKWARD) {
3145  MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix);
3146  }
3147  }else{
3148  op_qpix = s->me.qpel_put;
3149  if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
3150  op_pix = s->hdsp.put_pixels_tab;
3151  }else{
3152  op_pix = s->hdsp.put_no_rnd_pixels_tab;
3153  }
3154  if (s->mv_dir & MV_DIR_FORWARD) {
3155  ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix, op_qpix);
3156  op_pix = s->hdsp.avg_pixels_tab;
3157  op_qpix= s->me.qpel_avg;
3158  }
3159  if (s->mv_dir & MV_DIR_BACKWARD) {
3160  ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix, op_qpix);
3161  }
3162  }
3163  }
3164 
3165  /* skip dequant / idct if we are really late ;) */
3166  if(s->avctx->skip_idct){
3169  || s->avctx->skip_idct >= AVDISCARD_ALL)
3170  goto skip_idct;
3171  }
3172 
3173  /* add dct residue */
3175  || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
3176  add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3177  add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3178  add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3179  add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3180 
3181  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
3182  if (s->chroma_y_shift){
3183  add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3184  add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3185  }else{
3186  dct_linesize >>= 1;
3187  dct_offset >>=1;
3188  add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
3189  add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
3190  add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
3191  add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
3192  }
3193  }
3194  } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
3195  add_dct(s, block[0], 0, dest_y , dct_linesize);
3196  add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3197  add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3198  add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
3199 
3200  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
3201  if(s->chroma_y_shift){//Chroma420
3202  add_dct(s, block[4], 4, dest_cb, uvlinesize);
3203  add_dct(s, block[5], 5, dest_cr, uvlinesize);
3204  }else{
3205  //chroma422
3206  dct_linesize = uvlinesize << s->interlaced_dct;
3207  dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
3208 
3209  add_dct(s, block[4], 4, dest_cb, dct_linesize);
3210  add_dct(s, block[5], 5, dest_cr, dct_linesize);
3211  add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3212  add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3213  if(!s->chroma_x_shift){//Chroma444
3214  add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
3215  add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
3216  add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
3217  add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
3218  }
3219  }
3220  }//fi gray
3221  }
3222  else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
3223  ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3224  }
3225  } else {
3226  /* dct only in intra block */
3228  put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3229  put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3230  put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3231  put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3232 
3233  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
3234  if(s->chroma_y_shift){
3235  put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3236  put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3237  }else{
3238  dct_offset >>=1;
3239  dct_linesize >>=1;
3240  put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
3241  put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
3242  put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
3243  put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
3244  }
3245  }
3246  }else{
3247  s->idsp.idct_put(dest_y, dct_linesize, block[0]);
3248  s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3249  s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]);
3250  s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3251 
3252  if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
3253  if(s->chroma_y_shift){
3254  s->idsp.idct_put(dest_cb, uvlinesize, block[4]);
3255  s->idsp.idct_put(dest_cr, uvlinesize, block[5]);
3256  }else{
3257 
3258  dct_linesize = uvlinesize << s->interlaced_dct;
3259  dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
3260 
3261  s->idsp.idct_put(dest_cb, dct_linesize, block[4]);
3262  s->idsp.idct_put(dest_cr, dct_linesize, block[5]);
3263  s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3264  s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3265  if(!s->chroma_x_shift){//Chroma444
3266  s->idsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
3267  s->idsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
3268  s->idsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
3269  s->idsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
3270  }
3271  }
3272  }//gray
3273  }
3274  }
3275 skip_idct:
3276  if(!readable){
3277  s->hdsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3278  s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3279  s->hdsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3280  }
3281  }
3282 }
3283 
3284 void ff_mpv_decode_mb(MpegEncContext *s, int16_t block[12][64])
3285 {
3286 #if !CONFIG_SMALL
3287  if(s->out_format == FMT_MPEG1) {
3288  if(s->avctx->lowres) mpv_decode_mb_internal(s, block, 1, 1);
3289  else mpv_decode_mb_internal(s, block, 0, 1);
3290  } else
3291 #endif
3292  if(s->avctx->lowres) mpv_decode_mb_internal(s, block, 1, 0);
3293  else mpv_decode_mb_internal(s, block, 0, 0);
3294 }
3295 
3297 {
3300  s->first_field, s->low_delay);
3301 }
3302 
3303 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
3304  const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics
3305  const int uvlinesize = s->current_picture.f->linesize[1];
3306  const int mb_size= 4 - s->avctx->lowres;
3307 
3308  s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
3309  s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
3310  s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
3311  s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
3312  s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3313  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;
3314  //block_index is not used by mpeg2, so it is not affected by chroma_format
3315 
3316  s->dest[0] = s->current_picture.f->data[0] + ((s->mb_x - 1) << mb_size);
3317  s->dest[1] = s->current_picture.f->data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
3318  s->dest[2] = s->current_picture.f->data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
3319 
3321  {
3322  if(s->picture_structure==PICT_FRAME){
3323  s->dest[0] += s->mb_y * linesize << mb_size;
3324  s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
3325  s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
3326  }else{
3327  s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
3328  s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
3329  s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
3331  }
3332  }
3333 }
3334 
3335 /**
3336  * Permute an 8x8 block.
3337  * @param block the block which will be permuted according to the given permutation vector
3338  * @param permutation the permutation vector
3339  * @param last the last non zero coefficient in scantable order, used to speed the permutation up
3340  * @param scantable the used scantable, this is only used to speed the permutation up, the block is not
3341  * (inverse) permutated to scantable order!
3342  */
3343 void ff_block_permute(int16_t *block, uint8_t *permutation, const uint8_t *scantable, int last)
3344 {
3345  int i;
3346  int16_t temp[64];
3347 
3348  if(last<=0) return;
3349  //if(permutation[1]==1) return; //FIXME it is ok but not clean and might fail for some permutations
3350 
3351  for(i=0; i<=last; i++){
3352  const int j= scantable[i];
3353  temp[j]= block[j];
3354  block[j]=0;
3355  }
3356 
3357  for(i=0; i<=last; i++){
3358  const int j= scantable[i];
3359  const int perm_j= permutation[j];
3360  block[perm_j]= temp[j];
3361  }
3362 }
3363 
3365  int i;
3366  MpegEncContext *s = avctx->priv_data;
3367 
3368  if (!s || !s->picture)
3369  return;
3370 
3371  for (i = 0; i < MAX_PICTURE_COUNT; i++)
3372  ff_mpeg_unref_picture(s, &s->picture[i]);
3374 
3378 
3379  s->mb_x= s->mb_y= 0;
3380  s->closed_gop= 0;
3381 
3382  s->parse_context.state= -1;
3384  s->parse_context.overread= 0;
3386  s->parse_context.index= 0;
3387  s->parse_context.last_index= 0;
3388  s->bitstream_buffer_size=0;
3389  s->pp_time=0;
3390 }
3391 
3392 /**
3393  * set qscale and update qscale dependent variables.
3394  */
3395 void ff_set_qscale(MpegEncContext * s, int qscale)
3396 {
3397  if (qscale < 1)
3398  qscale = 1;
3399  else if (qscale > 31)
3400  qscale = 31;
3401 
3402  s->qscale = qscale;
3403  s->chroma_qscale= s->chroma_qscale_table[qscale];
3404 
3405  s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3407 }
3408 
3410 {
3413 }