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>
6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of FFmpeg.
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.
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.
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
26 * @file libavcodec/mpegvideo.c
27 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "libavutil/intmath.h"
33 #include "mpegvideo.h"
34 #include "mpegvideo_common.h"
38 #include "xvmc_internal.h"
44 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
57 DCTELEM *block, int n, int qscale);
60 /* enable all paranoid tests for rounding, overflows, etc... */
66 static const uint8_t ff_default_chroma_qscale_table[32]={
67 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
68 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
71 const uint8_t ff_mpeg1_dc_scale_table[128]={
72 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
73 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
74 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
76 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
79 const enum PixelFormat ff_pixfmt_list_420[] = {
84 const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = {
91 const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
99 uint32_t tmp= *state << 8;
100 *state= tmp + *(p++);
101 if(tmp == 0x100 || p==end)
106 if (p[-1] > 1 ) p+= 3;
107 else if(p[-2] ) p+= 2;
108 else if(p[-3]|(p[-1]-1)) p++;
121 /* init common dct for both encoder and decoder */
122 av_cold int ff_dct_common_init(MpegEncContext *s)
124 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
125 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
126 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
127 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
128 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
129 if(s->flags & CODEC_FLAG_BITEXACT)
130 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
131 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
134 MPV_common_init_mmx(s);
136 MPV_common_init_axp(s);
138 MPV_common_init_mlib(s);
140 MPV_common_init_mmi(s);
142 MPV_common_init_arm(s);
144 MPV_common_init_altivec(s);
146 MPV_common_init_bfin(s);
149 /* load & permutate scantables
150 note: only wmv uses different ones
152 if(s->alternate_scan){
153 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
154 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
156 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
157 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
159 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
160 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
165 void ff_copy_picture(Picture *dst, Picture *src){
167 dst->type= FF_BUFFER_TYPE_COPY;
171 * Releases a frame buffer
173 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
175 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
176 av_freep(&pic->hwaccel_picture_private);
180 * Allocates a frame buffer
182 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
186 if (s->avctx->hwaccel) {
187 assert(!pic->hwaccel_picture_private);
188 if (s->avctx->hwaccel->priv_data_size) {
189 pic->hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
190 if (!pic->hwaccel_picture_private) {
191 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
197 r = s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
199 if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
200 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
201 av_freep(&pic->hwaccel_picture_private);
205 if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) {
206 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
207 free_frame_buffer(s, pic);
211 if (pic->linesize[1] != pic->linesize[2]) {
212 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
213 free_frame_buffer(s, pic);
221 * allocates a Picture
222 * The pixels are allocated/set by calling get_buffer() if shared=0
224 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){
225 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
226 const int mb_array_size= s->mb_stride*s->mb_height;
227 const int b8_array_size= s->b8_stride*s->mb_height*2;
228 const int b4_array_size= s->b4_stride*s->mb_height*4;
233 assert(pic->data[0]);
234 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
235 pic->type= FF_BUFFER_TYPE_SHARED;
237 assert(!pic->data[0]);
239 if (alloc_frame_buffer(s, pic) < 0)
242 s->linesize = pic->linesize[0];
243 s->uvlinesize= pic->linesize[1];
246 if(pic->qscale_table==NULL){
248 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var , mb_array_size * sizeof(int16_t) , fail)
249 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t) , fail)
250 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean , mb_array_size * sizeof(int8_t ) , fail)
253 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check
254 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t) , fail)
255 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail)
256 pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1;
257 if(s->out_format == FMT_H264){
259 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t), fail)
260 pic->motion_val[i]= pic->motion_val_base[i]+4;
261 FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
263 pic->motion_subsample_log2= 2;
264 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
266 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail)
267 pic->motion_val[i]= pic->motion_val_base[i]+4;
268 FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], b8_array_size * sizeof(uint8_t), fail)
270 pic->motion_subsample_log2= 3;
272 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
273 FF_ALLOCZ_OR_GOTO(s->avctx, pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6, fail)
275 pic->qstride= s->mb_stride;
276 FF_ALLOCZ_OR_GOTO(s->avctx, pic->pan_scan , 1 * sizeof(AVPanScan), fail)
279 /* It might be nicer if the application would keep track of these
280 * but it would require an API change. */
281 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
282 s->prev_pict_types[0]= s->dropable ? FF_B_TYPE : s->pict_type;
283 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == FF_B_TYPE)
284 pic->age= INT_MAX; // Skipped MBs in B-frames are quite rare in MPEG-1/2 and it is a bit tricky to skip them anyway.
287 fail: //for the FF_ALLOCZ_OR_GOTO macro
289 free_frame_buffer(s, pic);
294 * deallocates a picture
296 static void free_picture(MpegEncContext *s, Picture *pic){
299 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
300 free_frame_buffer(s, pic);
303 av_freep(&pic->mb_var);
304 av_freep(&pic->mc_mb_var);
305 av_freep(&pic->mb_mean);
306 av_freep(&pic->mbskip_table);
307 av_freep(&pic->qscale_table);
308 av_freep(&pic->mb_type_base);
309 av_freep(&pic->dct_coeff);
310 av_freep(&pic->pan_scan);
313 av_freep(&pic->motion_val_base[i]);
314 av_freep(&pic->ref_index[i]);
317 if(pic->type == FF_BUFFER_TYPE_SHARED){
326 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
329 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
330 FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
331 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
333 //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
334 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail)
335 s->me.temp= s->me.scratchpad;
336 s->rd_scratchpad= s->me.scratchpad;
337 s->b_scratchpad= s->me.scratchpad;
338 s->obmc_scratchpad= s->me.scratchpad + 16;
340 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map , ME_MAP_SIZE*sizeof(uint32_t), fail)
341 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail)
342 if(s->avctx->noise_reduction){
343 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail)
346 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail)
347 s->block= s->blocks[0];
350 s->pblocks[i] = &s->block[i];
354 return -1; //free() through MPV_common_end()
357 static void free_duplicate_context(MpegEncContext *s){
360 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
361 av_freep(&s->me.scratchpad);
365 s->obmc_scratchpad= NULL;
367 av_freep(&s->dct_error_sum);
368 av_freep(&s->me.map);
369 av_freep(&s->me.score_map);
370 av_freep(&s->blocks);
374 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
375 #define COPY(a) bak->a= src->a
376 COPY(allocated_edge_emu_buffer);
377 COPY(edge_emu_buffer);
382 COPY(obmc_scratchpad);
389 COPY(me.map_generation);
397 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
400 //FIXME copy only needed parts
402 backup_duplicate_context(&bak, dst);
403 memcpy(dst, src, sizeof(MpegEncContext));
404 backup_duplicate_context(dst, &bak);
406 dst->pblocks[i] = &dst->block[i];
408 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
412 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
413 * the changed fields will not depend upon the prior state of the MpegEncContext.
415 void MPV_common_defaults(MpegEncContext *s){
417 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
418 s->chroma_qscale_table= ff_default_chroma_qscale_table;
419 s->progressive_frame= 1;
420 s->progressive_sequence= 1;
421 s->picture_structure= PICT_FRAME;
423 s->coded_picture_number = 0;
424 s->picture_number = 0;
425 s->input_picture_number = 0;
427 s->picture_in_gop_number = 0;
434 * sets the given MpegEncContext to defaults for decoding.
435 * the changed fields will not depend upon the prior state of the MpegEncContext.
437 void MPV_decode_defaults(MpegEncContext *s){
438 MPV_common_defaults(s);
442 * init common structure for both encoder and decoder.
443 * this assumes that some variables like width/height are already set
445 av_cold int MPV_common_init(MpegEncContext *s)
447 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads;
449 if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
450 s->mb_height = (s->height + 31) / 32 * 2;
452 s->mb_height = (s->height + 15) / 16;
454 if(s->avctx->pix_fmt == PIX_FMT_NONE){
455 av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n");
459 if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
460 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
464 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
467 dsputil_init(&s->dsp, s->avctx);
468 ff_dct_common_init(s);
470 s->flags= s->avctx->flags;
471 s->flags2= s->avctx->flags2;
473 s->mb_width = (s->width + 15) / 16;
474 s->mb_stride = s->mb_width + 1;
475 s->b8_stride = s->mb_width*2 + 1;
476 s->b4_stride = s->mb_width*4 + 1;
477 mb_array_size= s->mb_height * s->mb_stride;
478 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
480 /* set chroma shifts */
481 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
482 &(s->chroma_y_shift) );
484 /* set default edge pos, will be overriden in decode_header if needed */
485 s->h_edge_pos= s->mb_width*16;
486 s->v_edge_pos= s->mb_height*16;
488 s->mb_num = s->mb_width * s->mb_height;
493 s->block_wrap[3]= s->b8_stride;
495 s->block_wrap[5]= s->mb_stride;
497 y_size = s->b8_stride * (2 * s->mb_height + 1);
498 c_size = s->mb_stride * (s->mb_height + 1);
499 yc_size = y_size + 2 * c_size;
501 /* convert fourcc to upper case */
502 s->codec_tag= toupper( s->avctx->codec_tag &0xFF)
503 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
504 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
505 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
507 s->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
508 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
509 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
510 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
512 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
514 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
515 for(y=0; y<s->mb_height; y++){
516 for(x=0; x<s->mb_width; x++){
517 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
520 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
523 /* Allocate MV tables */
524 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
525 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
526 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
527 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
528 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
529 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
530 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
531 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
532 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
533 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
534 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
535 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
537 if(s->msmpeg4_version){
538 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
540 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
542 /* Allocate MB type table */
543 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
545 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
547 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix , 64*32 * sizeof(int), fail)
548 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix , 64*32 * sizeof(int), fail)
549 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
550 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
551 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
552 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
554 if(s->avctx->noise_reduction){
555 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
558 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, MAX_PICTURE_COUNT * sizeof(Picture), fail)
559 for(i = 0; i < MAX_PICTURE_COUNT; i++) {
560 avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
563 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
565 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
566 /* interlaced direct mode decoding tables */
571 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
572 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
574 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
575 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
576 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
578 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
581 if (s->out_format == FMT_H263) {
583 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
584 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
585 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
586 s->ac_val[2] = s->ac_val[1] + c_size;
589 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
590 s->coded_block= s->coded_block_base + s->b8_stride + 1;
592 /* cbp, ac_pred, pred_dir */
593 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail)
594 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
597 if (s->h263_pred || s->h263_plus || !s->encoding) {
599 //MN: we need these for error resilience of intra-frames
600 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
601 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
602 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
603 s->dc_val[2] = s->dc_val[1] + c_size;
604 for(i=0;i<yc_size;i++)
605 s->dc_val_base[i] = 1024;
608 /* which mb is a intra block */
609 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
610 memset(s->mbintra_table, 1, mb_array_size);
612 /* init macroblock skip table */
613 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
614 //Note the +1 is for a quicker mpeg4 slice_end detection
615 FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
617 s->parse_context.state= -1;
618 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
619 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
620 s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
621 s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
624 s->context_initialized = 1;
626 s->thread_context[0]= s;
627 threads = s->avctx->thread_count;
629 for(i=1; i<threads; i++){
630 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
631 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
634 for(i=0; i<threads; i++){
635 if(init_duplicate_context(s->thread_context[i], s) < 0)
637 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
638 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
647 /* init common structure for both encoder and decoder */
648 void MPV_common_end(MpegEncContext *s)
652 for(i=0; i<s->avctx->thread_count; i++){
653 free_duplicate_context(s->thread_context[i]);
655 for(i=1; i<s->avctx->thread_count; i++){
656 av_freep(&s->thread_context[i]);
659 av_freep(&s->parse_context.buffer);
660 s->parse_context.buffer_size=0;
662 av_freep(&s->mb_type);
663 av_freep(&s->p_mv_table_base);
664 av_freep(&s->b_forw_mv_table_base);
665 av_freep(&s->b_back_mv_table_base);
666 av_freep(&s->b_bidir_forw_mv_table_base);
667 av_freep(&s->b_bidir_back_mv_table_base);
668 av_freep(&s->b_direct_mv_table_base);
670 s->b_forw_mv_table= NULL;
671 s->b_back_mv_table= NULL;
672 s->b_bidir_forw_mv_table= NULL;
673 s->b_bidir_back_mv_table= NULL;
674 s->b_direct_mv_table= NULL;
678 av_freep(&s->b_field_mv_table_base[i][j][k]);
679 s->b_field_mv_table[i][j][k]=NULL;
681 av_freep(&s->b_field_select_table[i][j]);
682 av_freep(&s->p_field_mv_table_base[i][j]);
683 s->p_field_mv_table[i][j]=NULL;
685 av_freep(&s->p_field_select_table[i]);
688 av_freep(&s->dc_val_base);
689 av_freep(&s->ac_val_base);
690 av_freep(&s->coded_block_base);
691 av_freep(&s->mbintra_table);
692 av_freep(&s->cbp_table);
693 av_freep(&s->pred_dir_table);
695 av_freep(&s->mbskip_table);
696 av_freep(&s->prev_pict_types);
697 av_freep(&s->bitstream_buffer);
698 s->allocated_bitstream_buffer_size=0;
700 av_freep(&s->avctx->stats_out);
701 av_freep(&s->ac_stats);
702 av_freep(&s->error_status_table);
703 av_freep(&s->mb_index2xy);
704 av_freep(&s->lambda_table);
705 av_freep(&s->q_intra_matrix);
706 av_freep(&s->q_inter_matrix);
707 av_freep(&s->q_intra_matrix16);
708 av_freep(&s->q_inter_matrix16);
709 av_freep(&s->input_picture);
710 av_freep(&s->reordered_input_picture);
711 av_freep(&s->dct_offset);
714 for(i=0; i<MAX_PICTURE_COUNT; i++){
715 free_picture(s, &s->picture[i]);
718 av_freep(&s->picture);
719 s->context_initialized = 0;
722 s->current_picture_ptr= NULL;
723 s->linesize= s->uvlinesize= 0;
726 av_freep(&s->visualization_buffer[i]);
728 avcodec_default_free_buffers(s->avctx);
731 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
733 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
734 uint8_t index_run[MAX_RUN+1];
735 int last, run, level, start, end, i;
737 /* If table is static, we can quit if rl->max_level[0] is not NULL */
738 if(static_store && rl->max_level[0])
741 /* compute max_level[], max_run[] and index_run[] */
742 for(last=0;last<2;last++) {
751 memset(max_level, 0, MAX_RUN + 1);
752 memset(max_run, 0, MAX_LEVEL + 1);
753 memset(index_run, rl->n, MAX_RUN + 1);
754 for(i=start;i<end;i++) {
755 run = rl->table_run[i];
756 level = rl->table_level[i];
757 if (index_run[run] == rl->n)
759 if (level > max_level[run])
760 max_level[run] = level;
761 if (run > max_run[level])
762 max_run[level] = run;
765 rl->max_level[last] = static_store[last];
767 rl->max_level[last] = av_malloc(MAX_RUN + 1);
768 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
770 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
772 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
773 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
775 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
777 rl->index_run[last] = av_malloc(MAX_RUN + 1);
778 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
782 void init_vlc_rl(RLTable *rl)
794 for(i=0; i<rl->vlc.table_size; i++){
795 int code= rl->vlc.table[i][0];
796 int len = rl->vlc.table[i][1];
799 if(len==0){ // illegal code
802 }else if(len<0){ //more bits needed
806 if(code==rl->n){ //esc
810 run= rl->table_run [code] + 1;
811 level= rl->table_level[code] * qmul + qadd;
812 if(code >= rl->last) run+=192;
815 rl->rl_vlc[q][i].len= len;
816 rl->rl_vlc[q][i].level= level;
817 rl->rl_vlc[q][i].run= run;
822 int ff_find_unused_picture(MpegEncContext *s, int shared){
826 for(i=0; i<MAX_PICTURE_COUNT; i++){
827 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
830 for(i=0; i<MAX_PICTURE_COUNT; i++){
831 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
833 for(i=0; i<MAX_PICTURE_COUNT; i++){
834 if(s->picture[i].data[0]==NULL) return i;
838 av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
839 /* We could return -1, but the codec would crash trying to draw into a
840 * non-existing frame anyway. This is safer than waiting for a random crash.
841 * Also the return of this is never useful, an encoder must only allocate
842 * as much as allowed in the specification. This has no relationship to how
843 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
844 * enough for such valid streams).
845 * Plus, a decoder has to check stream validity and remove frames if too
846 * many reference frames are around. Waiting for "OOM" is not correct at
847 * all. Similarly, missing reference frames have to be replaced by
848 * interpolated/MC frames, anything else is a bug in the codec ...
854 static void update_noise_reduction(MpegEncContext *s){
857 for(intra=0; intra<2; intra++){
858 if(s->dct_count[intra] > (1<<16)){
860 s->dct_error_sum[intra][i] >>=1;
862 s->dct_count[intra] >>= 1;
866 s->dct_offset[intra][i]= (s->avctx->noise_reduction * s->dct_count[intra] + s->dct_error_sum[intra][i]/2) / (s->dct_error_sum[intra][i]+1);
872 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
874 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
880 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
882 /* mark&release old frames */
883 if (s->pict_type != FF_B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
884 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
885 free_frame_buffer(s, s->last_picture_ptr);
887 /* release forgotten pictures */
888 /* if(mpeg124/h263) */
890 for(i=0; i<MAX_PICTURE_COUNT; i++){
891 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
892 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
893 free_frame_buffer(s, &s->picture[i]);
901 /* release non reference frames */
902 for(i=0; i<MAX_PICTURE_COUNT; i++){
903 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
904 free_frame_buffer(s, &s->picture[i]);
908 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
909 pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
911 i= ff_find_unused_picture(s, 0);
917 if (s->codec_id == CODEC_ID_H264)
918 pic->reference = s->picture_structure;
919 else if (s->pict_type != FF_B_TYPE)
923 pic->coded_picture_number= s->coded_picture_number++;
925 if(ff_alloc_picture(s, pic, 0) < 0)
928 s->current_picture_ptr= pic;
929 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
930 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
933 s->current_picture_ptr->pict_type= s->pict_type;
934 // if(s->flags && CODEC_FLAG_QSCALE)
935 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
936 s->current_picture_ptr->key_frame= s->pict_type == FF_I_TYPE;
938 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
940 if (s->pict_type != FF_B_TYPE) {
941 s->last_picture_ptr= s->next_picture_ptr;
943 s->next_picture_ptr= s->current_picture_ptr;
945 /* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
946 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
947 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
948 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
949 s->pict_type, s->dropable);*/
951 if(s->codec_id != CODEC_ID_H264){
952 if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && s->pict_type!=FF_I_TYPE){
953 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
954 /* Allocate a dummy frame */
955 i= ff_find_unused_picture(s, 0);
956 s->last_picture_ptr= &s->picture[i];
957 if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
960 if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==FF_B_TYPE){
961 /* Allocate a dummy frame */
962 i= ff_find_unused_picture(s, 0);
963 s->next_picture_ptr= &s->picture[i];
964 if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
969 if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
970 if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
972 assert(s->pict_type == FF_I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
974 if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
977 if(s->picture_structure == PICT_BOTTOM_FIELD){
978 s->current_picture.data[i] += s->current_picture.linesize[i];
980 s->current_picture.linesize[i] *= 2;
981 s->last_picture.linesize[i] *=2;
982 s->next_picture.linesize[i] *=2;
986 s->hurry_up= s->avctx->hurry_up;
987 s->error_recognition= avctx->error_recognition;
989 /* set dequantizer, we can't do it during init as it might change for mpeg4
990 and we can't do it in the header decode as init is not called for mpeg4 there yet */
991 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
992 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
993 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
994 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
995 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
996 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
998 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
999 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1002 if(s->dct_error_sum){
1003 assert(s->avctx->noise_reduction && s->encoding);
1005 update_noise_reduction(s);
1008 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1009 return ff_xvmc_field_start(s, avctx);
1014 /* generic function for encode/decode called after a frame has been coded/decoded */
1015 void MPV_frame_end(MpegEncContext *s)
1018 /* draw edge for correct motion prediction if outside */
1019 //just to make sure that all data is rendered.
1020 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1021 ff_xvmc_field_end(s);
1022 }else if(!s->avctx->hwaccel
1023 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1024 && s->unrestricted_mv
1025 && s->current_picture.reference
1027 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1028 s->dsp.draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1029 s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1030 s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1034 s->last_pict_type = s->pict_type;
1035 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1036 if(s->pict_type!=FF_B_TYPE){
1037 s->last_non_b_pict_type= s->pict_type;
1040 /* copy back current_picture variables */
1041 for(i=0; i<MAX_PICTURE_COUNT; i++){
1042 if(s->picture[i].data[0] == s->current_picture.data[0]){
1043 s->picture[i]= s->current_picture;
1047 assert(i<MAX_PICTURE_COUNT);
1051 /* release non-reference frames */
1052 for(i=0; i<MAX_PICTURE_COUNT; i++){
1053 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1054 free_frame_buffer(s, &s->picture[i]);
1058 // clear copies, to avoid confusion
1060 memset(&s->last_picture, 0, sizeof(Picture));
1061 memset(&s->next_picture, 0, sizeof(Picture));
1062 memset(&s->current_picture, 0, sizeof(Picture));
1064 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1068 * draws an line from (ex, ey) -> (sx, sy).
1069 * @param w width of the image
1070 * @param h height of the image
1071 * @param stride stride/linesize of the image
1072 * @param color color of the arrow
1074 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1077 sx= av_clip(sx, 0, w-1);
1078 sy= av_clip(sy, 0, h-1);
1079 ex= av_clip(ex, 0, w-1);
1080 ey= av_clip(ey, 0, h-1);
1082 buf[sy*stride + sx]+= color;
1084 if(FFABS(ex - sx) > FFABS(ey - sy)){
1086 FFSWAP(int, sx, ex);
1087 FFSWAP(int, sy, ey);
1089 buf+= sx + sy*stride;
1091 f= ((ey-sy)<<16)/ex;
1092 for(x= 0; x <= ex; x++){
1095 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1096 buf[(y+1)*stride + x]+= (color* fr )>>16;
1100 FFSWAP(int, sx, ex);
1101 FFSWAP(int, sy, ey);
1103 buf+= sx + sy*stride;
1105 if(ey) f= ((ex-sx)<<16)/ey;
1107 for(y= 0; y <= ey; y++){
1110 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;
1111 buf[y*stride + x+1]+= (color* fr )>>16;
1117 * draws an arrow from (ex, ey) -> (sx, sy).
1118 * @param w width of the image
1119 * @param h height of the image
1120 * @param stride stride/linesize of the image
1121 * @param color color of the arrow
1123 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1126 sx= av_clip(sx, -100, w+100);
1127 sy= av_clip(sy, -100, h+100);
1128 ex= av_clip(ex, -100, w+100);
1129 ey= av_clip(ey, -100, h+100);
1134 if(dx*dx + dy*dy > 3*3){
1137 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1139 //FIXME subpixel accuracy
1140 rx= ROUNDED_DIV(rx*3<<4, length);
1141 ry= ROUNDED_DIV(ry*3<<4, length);
1143 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1144 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1146 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1150 * prints debuging info for the given picture.
1152 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1154 if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1156 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1159 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1160 switch (pict->pict_type) {
1161 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1162 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1163 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1164 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1165 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1166 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1168 for(y=0; y<s->mb_height; y++){
1169 for(x=0; x<s->mb_width; x++){
1170 if(s->avctx->debug&FF_DEBUG_SKIP){
1171 int count= s->mbskip_table[x + y*s->mb_stride];
1172 if(count>9) count=9;
1173 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1175 if(s->avctx->debug&FF_DEBUG_QP){
1176 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1178 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1179 int mb_type= pict->mb_type[x + y*s->mb_stride];
1180 //Type & MV direction
1182 av_log(s->avctx, AV_LOG_DEBUG, "P");
1183 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1184 av_log(s->avctx, AV_LOG_DEBUG, "A");
1185 else if(IS_INTRA4x4(mb_type))
1186 av_log(s->avctx, AV_LOG_DEBUG, "i");
1187 else if(IS_INTRA16x16(mb_type))
1188 av_log(s->avctx, AV_LOG_DEBUG, "I");
1189 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1190 av_log(s->avctx, AV_LOG_DEBUG, "d");
1191 else if(IS_DIRECT(mb_type))
1192 av_log(s->avctx, AV_LOG_DEBUG, "D");
1193 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1194 av_log(s->avctx, AV_LOG_DEBUG, "g");
1195 else if(IS_GMC(mb_type))
1196 av_log(s->avctx, AV_LOG_DEBUG, "G");
1197 else if(IS_SKIP(mb_type))
1198 av_log(s->avctx, AV_LOG_DEBUG, "S");
1199 else if(!USES_LIST(mb_type, 1))
1200 av_log(s->avctx, AV_LOG_DEBUG, ">");
1201 else if(!USES_LIST(mb_type, 0))
1202 av_log(s->avctx, AV_LOG_DEBUG, "<");
1204 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1205 av_log(s->avctx, AV_LOG_DEBUG, "X");
1210 av_log(s->avctx, AV_LOG_DEBUG, "+");
1211 else if(IS_16X8(mb_type))
1212 av_log(s->avctx, AV_LOG_DEBUG, "-");
1213 else if(IS_8X16(mb_type))
1214 av_log(s->avctx, AV_LOG_DEBUG, "|");
1215 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1216 av_log(s->avctx, AV_LOG_DEBUG, " ");
1218 av_log(s->avctx, AV_LOG_DEBUG, "?");
1221 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1222 av_log(s->avctx, AV_LOG_DEBUG, "=");
1224 av_log(s->avctx, AV_LOG_DEBUG, " ");
1226 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1228 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1232 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1233 const int shift= 1 + s->quarter_sample;
1237 int h_chroma_shift, v_chroma_shift, block_height;
1238 const int width = s->avctx->width;
1239 const int height= s->avctx->height;
1240 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1241 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1242 s->low_delay=0; //needed to see the vectors without trashing the buffers
1244 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1246 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1247 pict->data[i]= s->visualization_buffer[i];
1249 pict->type= FF_BUFFER_TYPE_COPY;
1251 block_height = 16>>v_chroma_shift;
1253 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1255 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1256 const int mb_index= mb_x + mb_y*s->mb_stride;
1257 if((s->avctx->debug_mv) && pict->motion_val){
1259 for(type=0; type<3; type++){
1262 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1266 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1270 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1275 if(!USES_LIST(pict->mb_type[mb_index], direction))
1278 if(IS_8X8(pict->mb_type[mb_index])){
1281 int sx= mb_x*16 + 4 + 8*(i&1);
1282 int sy= mb_y*16 + 4 + 8*(i>>1);
1283 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1284 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1285 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1286 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1288 }else if(IS_16X8(pict->mb_type[mb_index])){
1292 int sy=mb_y*16 + 4 + 8*i;
1293 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1294 int mx=(pict->motion_val[direction][xy][0]>>shift);
1295 int my=(pict->motion_val[direction][xy][1]>>shift);
1297 if(IS_INTERLACED(pict->mb_type[mb_index]))
1300 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1302 }else if(IS_8X16(pict->mb_type[mb_index])){
1305 int sx=mb_x*16 + 4 + 8*i;
1307 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1308 int mx=(pict->motion_val[direction][xy][0]>>shift);
1309 int my=(pict->motion_val[direction][xy][1]>>shift);
1311 if(IS_INTERLACED(pict->mb_type[mb_index]))
1314 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1317 int sx= mb_x*16 + 8;
1318 int sy= mb_y*16 + 8;
1319 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1320 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1321 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1322 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1326 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1327 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1329 for(y=0; y<block_height; y++){
1330 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
1331 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
1334 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1335 int mb_type= pict->mb_type[mb_index];
1338 #define COLOR(theta, r)\
1339 u= (int)(128 + r*cos(theta*3.141592/180));\
1340 v= (int)(128 + r*sin(theta*3.141592/180));
1344 if(IS_PCM(mb_type)){
1346 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1348 }else if(IS_INTRA4x4(mb_type)){
1350 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1352 }else if(IS_DIRECT(mb_type)){
1354 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1356 }else if(IS_GMC(mb_type)){
1358 }else if(IS_SKIP(mb_type)){
1360 }else if(!USES_LIST(mb_type, 1)){
1362 }else if(!USES_LIST(mb_type, 0)){
1365 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1369 u*= 0x0101010101010101ULL;
1370 v*= 0x0101010101010101ULL;
1371 for(y=0; y<block_height; y++){
1372 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
1373 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
1377 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1378 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1379 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1381 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1383 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1385 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1386 int dm= 1 << (mv_sample_log2-2);
1388 int sx= mb_x*16 + 8*(i&1);
1389 int sy= mb_y*16 + 8*(i>>1);
1390 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1392 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1393 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1395 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1396 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1397 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1401 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1405 s->mbskip_table[mb_index]=0;
1411 static inline int hpel_motion_lowres(MpegEncContext *s,
1412 uint8_t *dest, uint8_t *src,
1413 int field_based, int field_select,
1414 int src_x, int src_y,
1415 int width, int height, int stride,
1416 int h_edge_pos, int v_edge_pos,
1417 int w, int h, h264_chroma_mc_func *pix_op,
1418 int motion_x, int motion_y)
1420 const int lowres= s->avctx->lowres;
1421 const int op_index= FFMIN(lowres, 2);
1422 const int s_mask= (2<<lowres)-1;
1426 if(s->quarter_sample){
1431 sx= motion_x & s_mask;
1432 sy= motion_y & s_mask;
1433 src_x += motion_x >> (lowres+1);
1434 src_y += motion_y >> (lowres+1);
1436 src += src_y * stride + src_x;
1438 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
1439 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1440 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
1441 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1442 src= s->edge_emu_buffer;
1446 sx= (sx << 2) >> lowres;
1447 sy= (sy << 2) >> lowres;
1450 pix_op[op_index](dest, src, stride, h, sx, sy);
1454 /* apply one mpeg motion vector to the three components */
1455 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1456 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1457 int field_based, int bottom_field, int field_select,
1458 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1459 int motion_x, int motion_y, int h, int mb_y)
1461 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1462 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
1463 const int lowres= s->avctx->lowres;
1464 const int op_index= FFMIN(lowres, 2);
1465 const int block_s= 8>>lowres;
1466 const int s_mask= (2<<lowres)-1;
1467 const int h_edge_pos = s->h_edge_pos >> lowres;
1468 const int v_edge_pos = s->v_edge_pos >> lowres;
1469 linesize = s->current_picture.linesize[0] << field_based;
1470 uvlinesize = s->current_picture.linesize[1] << field_based;
1472 if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
1478 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
1481 sx= motion_x & s_mask;
1482 sy= motion_y & s_mask;
1483 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
1484 src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1486 if (s->out_format == FMT_H263) {
1487 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
1488 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
1491 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
1494 uvsx = (2*mx) & s_mask;
1495 uvsy = (2*my) & s_mask;
1496 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
1497 uvsrc_y = mb_y*block_s + (my >> lowres);
1503 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1504 uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1));
1507 ptr_y = ref_picture[0] + src_y * linesize + src_x;
1508 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1509 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1511 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
1512 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1513 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
1514 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1515 ptr_y = s->edge_emu_buffer;
1516 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1517 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1518 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
1519 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1520 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
1521 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1527 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
1528 dest_y += s->linesize;
1529 dest_cb+= s->uvlinesize;
1530 dest_cr+= s->uvlinesize;
1534 ptr_y += s->linesize;
1535 ptr_cb+= s->uvlinesize;
1536 ptr_cr+= s->uvlinesize;
1539 sx= (sx << 2) >> lowres;
1540 sy= (sy << 2) >> lowres;
1541 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1543 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1544 uvsx= (uvsx << 2) >> lowres;
1545 uvsy= (uvsy << 2) >> lowres;
1546 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1547 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1549 //FIXME h261 lowres loop filter
1552 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1553 uint8_t *dest_cb, uint8_t *dest_cr,
1554 uint8_t **ref_picture,
1555 h264_chroma_mc_func *pix_op,
1557 const int lowres= s->avctx->lowres;
1558 const int op_index= FFMIN(lowres, 2);
1559 const int block_s= 8>>lowres;
1560 const int s_mask= (2<<lowres)-1;
1561 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
1562 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
1563 int emu=0, src_x, src_y, offset, sx, sy;
1566 if(s->quarter_sample){
1571 /* In case of 8X8, we construct a single chroma motion vector
1572 with a special rounding */
1573 mx= ff_h263_round_chroma(mx);
1574 my= ff_h263_round_chroma(my);
1578 src_x = s->mb_x*block_s + (mx >> (lowres+1));
1579 src_y = s->mb_y*block_s + (my >> (lowres+1));
1581 offset = src_y * s->uvlinesize + src_x;
1582 ptr = ref_picture[1] + offset;
1583 if(s->flags&CODEC_FLAG_EMU_EDGE){
1584 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
1585 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
1586 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1587 ptr= s->edge_emu_buffer;
1591 sx= (sx << 2) >> lowres;
1592 sy= (sy << 2) >> lowres;
1593 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1595 ptr = ref_picture[2] + offset;
1597 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1598 ptr= s->edge_emu_buffer;
1600 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
1604 * motion compensation of a single macroblock
1606 * @param dest_y luma destination pointer
1607 * @param dest_cb chroma cb/u destination pointer
1608 * @param dest_cr chroma cr/v destination pointer
1609 * @param dir direction (0->forward, 1->backward)
1610 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
1611 * @param pic_op halfpel motion compensation function (average or put normally)
1612 * the motion vectors are taken from s->mv and the MV type from s->mv_type
1614 static inline void MPV_motion_lowres(MpegEncContext *s,
1615 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1616 int dir, uint8_t **ref_picture,
1617 h264_chroma_mc_func *pix_op)
1621 const int lowres= s->avctx->lowres;
1622 const int block_s= 8>>lowres;
1627 switch(s->mv_type) {
1629 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1631 ref_picture, pix_op,
1632 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
1638 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1639 ref_picture[0], 0, 0,
1640 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
1641 s->width, s->height, s->linesize,
1642 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
1643 block_s, block_s, pix_op,
1644 s->mv[dir][i][0], s->mv[dir][i][1]);
1646 mx += s->mv[dir][i][0];
1647 my += s->mv[dir][i][1];
1650 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
1651 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
1654 if (s->picture_structure == PICT_FRAME) {
1656 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1657 1, 0, s->field_select[dir][0],
1658 ref_picture, pix_op,
1659 s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
1661 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1662 1, 1, s->field_select[dir][1],
1663 ref_picture, pix_op,
1664 s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
1666 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != FF_B_TYPE && !s->first_field){
1667 ref_picture= s->current_picture_ptr->data;
1670 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1671 0, 0, s->field_select[dir][0],
1672 ref_picture, pix_op,
1673 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
1678 uint8_t ** ref2picture;
1680 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == FF_B_TYPE || s->first_field){
1681 ref2picture= ref_picture;
1683 ref2picture= s->current_picture_ptr->data;
1686 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1687 0, 0, s->field_select[dir][i],
1688 ref2picture, pix_op,
1689 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1691 dest_y += 2*block_s*s->linesize;
1692 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1693 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1697 if(s->picture_structure == PICT_FRAME){
1701 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1703 ref_picture, pix_op,
1704 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
1706 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1710 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1711 0, 0, s->picture_structure != i+1,
1712 ref_picture, pix_op,
1713 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1715 // after put we make avg of the same block
1716 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1718 //opposite parity is always in the same frame if this is second field
1719 if(!s->first_field){
1720 ref_picture = s->current_picture_ptr->data;
1729 /* put block[] to dest[] */
1730 static inline void put_dct(MpegEncContext *s,
1731 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1733 s->dct_unquantize_intra(s, block, i, qscale);
1734 s->dsp.idct_put (dest, line_size, block);
1737 /* add block[] to dest[] */
1738 static inline void add_dct(MpegEncContext *s,
1739 DCTELEM *block, int i, uint8_t *dest, int line_size)
1741 if (s->block_last_index[i] >= 0) {
1742 s->dsp.idct_add (dest, line_size, block);
1746 static inline void add_dequant_dct(MpegEncContext *s,
1747 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1749 if (s->block_last_index[i] >= 0) {
1750 s->dct_unquantize_inter(s, block, i, qscale);
1752 s->dsp.idct_add (dest, line_size, block);
1757 * cleans dc, ac, coded_block for the current non intra MB
1759 void ff_clean_intra_table_entries(MpegEncContext *s)
1761 int wrap = s->b8_stride;
1762 int xy = s->block_index[0];
1765 s->dc_val[0][xy + 1 ] =
1766 s->dc_val[0][xy + wrap] =
1767 s->dc_val[0][xy + 1 + wrap] = 1024;
1769 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
1770 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1771 if (s->msmpeg4_version>=3) {
1772 s->coded_block[xy ] =
1773 s->coded_block[xy + 1 ] =
1774 s->coded_block[xy + wrap] =
1775 s->coded_block[xy + 1 + wrap] = 0;
1778 wrap = s->mb_stride;
1779 xy = s->mb_x + s->mb_y * wrap;
1781 s->dc_val[2][xy] = 1024;
1783 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
1784 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1786 s->mbintra_table[xy]= 0;
1789 /* generic function called after a macroblock has been parsed by the
1790 decoder or after it has been encoded by the encoder.
1792 Important variables used:
1793 s->mb_intra : true if intra macroblock
1794 s->mv_dir : motion vector direction
1795 s->mv_type : motion vector type
1796 s->mv : motion vector
1797 s->interlaced_dct : true if interlaced dct used (mpeg2)
1799 static av_always_inline
1800 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
1801 int lowres_flag, int is_mpeg12)
1803 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
1804 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1805 ff_xvmc_decode_mb(s);//xvmc uses pblocks
1809 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
1810 /* save DCT coefficients */
1812 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
1815 *dct++ = block[i][s->dsp.idct_permutation[j]];
1818 s->current_picture.qscale_table[mb_xy]= s->qscale;
1820 /* update DC predictors for P macroblocks */
1822 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
1823 if(s->mbintra_table[mb_xy])
1824 ff_clean_intra_table_entries(s);
1828 s->last_dc[2] = 128 << s->intra_dc_precision;
1831 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
1832 s->mbintra_table[mb_xy]=1;
1834 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==FF_B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
1835 uint8_t *dest_y, *dest_cb, *dest_cr;
1836 int dct_linesize, dct_offset;
1837 op_pixels_func (*op_pix)[4];
1838 qpel_mc_func (*op_qpix)[16];
1839 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
1840 const int uvlinesize= s->current_picture.linesize[1];
1841 const int readable= s->pict_type != FF_B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
1842 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
1844 /* avoid copy if macroblock skipped in last frame too */
1845 /* skip only during decoding as we might trash the buffers during encoding a bit */
1847 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
1848 const int age= s->current_picture.age;
1852 if (s->mb_skipped) {
1854 assert(s->pict_type!=FF_I_TYPE);
1856 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
1857 if(*mbskip_ptr >99) *mbskip_ptr= 99;
1859 /* if previous was skipped too, then nothing to do ! */
1860 if (*mbskip_ptr >= age && s->current_picture.reference){
1863 } else if(!s->current_picture.reference){
1864 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
1865 if(*mbskip_ptr >99) *mbskip_ptr= 99;
1867 *mbskip_ptr = 0; /* not skipped */
1871 dct_linesize = linesize << s->interlaced_dct;
1872 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
1876 dest_cb= s->dest[1];
1877 dest_cr= s->dest[2];
1879 dest_y = s->b_scratchpad;
1880 dest_cb= s->b_scratchpad+16*linesize;
1881 dest_cr= s->b_scratchpad+32*linesize;
1885 /* motion handling */
1886 /* decoding or more than one mb_type (MC was already done otherwise) */
1889 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
1891 if (s->mv_dir & MV_DIR_FORWARD) {
1892 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
1893 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
1895 if (s->mv_dir & MV_DIR_BACKWARD) {
1896 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
1899 op_qpix= s->me.qpel_put;
1900 if ((!s->no_rounding) || s->pict_type==FF_B_TYPE){
1901 op_pix = s->dsp.put_pixels_tab;
1903 op_pix = s->dsp.put_no_rnd_pixels_tab;
1905 if (s->mv_dir & MV_DIR_FORWARD) {
1906 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
1907 op_pix = s->dsp.avg_pixels_tab;
1908 op_qpix= s->me.qpel_avg;
1910 if (s->mv_dir & MV_DIR_BACKWARD) {
1911 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
1916 /* skip dequant / idct if we are really late ;) */
1917 if(s->hurry_up>1) goto skip_idct;
1918 if(s->avctx->skip_idct){
1919 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == FF_B_TYPE)
1920 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != FF_I_TYPE)
1921 || s->avctx->skip_idct >= AVDISCARD_ALL)
1925 /* add dct residue */
1926 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
1927 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
1928 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
1929 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
1930 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
1931 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
1933 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1934 if (s->chroma_y_shift){
1935 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
1936 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
1940 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
1941 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
1942 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
1943 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
1946 } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
1947 add_dct(s, block[0], 0, dest_y , dct_linesize);
1948 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
1949 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
1950 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
1952 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1953 if(s->chroma_y_shift){//Chroma420
1954 add_dct(s, block[4], 4, dest_cb, uvlinesize);
1955 add_dct(s, block[5], 5, dest_cr, uvlinesize);
1958 dct_linesize = uvlinesize << s->interlaced_dct;
1959 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
1961 add_dct(s, block[4], 4, dest_cb, dct_linesize);
1962 add_dct(s, block[5], 5, dest_cr, dct_linesize);
1963 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
1964 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
1965 if(!s->chroma_x_shift){//Chroma444
1966 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
1967 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
1968 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
1969 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
1974 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
1975 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
1978 /* dct only in intra block */
1979 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
1980 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
1981 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
1982 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
1983 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
1985 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1986 if(s->chroma_y_shift){
1987 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
1988 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
1992 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
1993 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
1994 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
1995 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
1999 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2000 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2001 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2002 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2004 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2005 if(s->chroma_y_shift){
2006 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2007 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2010 dct_linesize = uvlinesize << s->interlaced_dct;
2011 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2013 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2014 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2015 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2016 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2017 if(!s->chroma_x_shift){//Chroma444
2018 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2019 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2020 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2021 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
2029 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2030 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2031 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2036 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2038 if(s->out_format == FMT_MPEG1) {
2039 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2040 else MPV_decode_mb_internal(s, block, 0, 1);
2043 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2044 else MPV_decode_mb_internal(s, block, 0, 0);
2049 * @param h is the normal height, this will be reduced automatically if needed for the last row
2051 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2052 if (s->avctx->draw_horiz_band) {
2054 const int field_pic= s->picture_structure != PICT_FRAME;
2057 h= FFMIN(h, (s->avctx->height>>field_pic) - y);
2059 if(field_pic && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)){
2062 if(s->first_field) return;
2065 if(s->pict_type==FF_B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2066 src= (AVFrame*)s->current_picture_ptr;
2067 else if(s->last_picture_ptr)
2068 src= (AVFrame*)s->last_picture_ptr;
2072 if(s->pict_type==FF_B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2078 offset[0]= y * s->linesize;
2080 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2086 s->avctx->draw_horiz_band(s->avctx, src, offset,
2087 y, s->picture_structure, h);
2091 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2092 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2093 const int uvlinesize= s->current_picture.linesize[1];
2094 const int mb_size= 4 - s->avctx->lowres;
2096 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2097 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2098 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2099 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2100 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2101 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;
2102 //block_index is not used by mpeg2, so it is not affected by chroma_format
2104 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
2105 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2106 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2108 if(!(s->pict_type==FF_B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2110 if(s->picture_structure==PICT_FRAME){
2111 s->dest[0] += s->mb_y * linesize << mb_size;
2112 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2113 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2115 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2116 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2117 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2118 assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2123 void ff_mpeg_flush(AVCodecContext *avctx){
2125 MpegEncContext *s = avctx->priv_data;
2127 if(s==NULL || s->picture==NULL)
2130 for(i=0; i<MAX_PICTURE_COUNT; i++){
2131 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
2132 || s->picture[i].type == FF_BUFFER_TYPE_USER))
2133 free_frame_buffer(s, &s->picture[i]);
2135 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2137 s->mb_x= s->mb_y= 0;
2140 s->parse_context.state= -1;
2141 s->parse_context.frame_start_found= 0;
2142 s->parse_context.overread= 0;
2143 s->parse_context.overread_index= 0;
2144 s->parse_context.index= 0;
2145 s->parse_context.last_index= 0;
2146 s->bitstream_buffer_size=0;
2150 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2151 DCTELEM *block, int n, int qscale)
2153 int i, level, nCoeffs;
2154 const uint16_t *quant_matrix;
2156 nCoeffs= s->block_last_index[n];
2159 block[0] = block[0] * s->y_dc_scale;
2161 block[0] = block[0] * s->c_dc_scale;
2162 /* XXX: only mpeg1 */
2163 quant_matrix = s->intra_matrix;
2164 for(i=1;i<=nCoeffs;i++) {
2165 int j= s->intra_scantable.permutated[i];
2170 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2171 level = (level - 1) | 1;
2174 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2175 level = (level - 1) | 1;
2182 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2183 DCTELEM *block, int n, int qscale)
2185 int i, level, nCoeffs;
2186 const uint16_t *quant_matrix;
2188 nCoeffs= s->block_last_index[n];
2190 quant_matrix = s->inter_matrix;
2191 for(i=0; i<=nCoeffs; i++) {
2192 int j= s->intra_scantable.permutated[i];
2197 level = (((level << 1) + 1) * qscale *
2198 ((int) (quant_matrix[j]))) >> 4;
2199 level = (level - 1) | 1;
2202 level = (((level << 1) + 1) * qscale *
2203 ((int) (quant_matrix[j]))) >> 4;
2204 level = (level - 1) | 1;
2211 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2212 DCTELEM *block, int n, int qscale)
2214 int i, level, nCoeffs;
2215 const uint16_t *quant_matrix;
2217 if(s->alternate_scan) nCoeffs= 63;
2218 else nCoeffs= s->block_last_index[n];
2221 block[0] = block[0] * s->y_dc_scale;
2223 block[0] = block[0] * s->c_dc_scale;
2224 quant_matrix = s->intra_matrix;
2225 for(i=1;i<=nCoeffs;i++) {
2226 int j= s->intra_scantable.permutated[i];
2231 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2234 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2241 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2242 DCTELEM *block, int n, int qscale)
2244 int i, level, nCoeffs;
2245 const uint16_t *quant_matrix;
2248 if(s->alternate_scan) nCoeffs= 63;
2249 else nCoeffs= s->block_last_index[n];
2252 block[0] = block[0] * s->y_dc_scale;
2254 block[0] = block[0] * s->c_dc_scale;
2255 quant_matrix = s->intra_matrix;
2256 for(i=1;i<=nCoeffs;i++) {
2257 int j= s->intra_scantable.permutated[i];
2262 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2265 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2274 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2275 DCTELEM *block, int n, int qscale)
2277 int i, level, nCoeffs;
2278 const uint16_t *quant_matrix;
2281 if(s->alternate_scan) nCoeffs= 63;
2282 else nCoeffs= s->block_last_index[n];
2284 quant_matrix = s->inter_matrix;
2285 for(i=0; i<=nCoeffs; i++) {
2286 int j= s->intra_scantable.permutated[i];
2291 level = (((level << 1) + 1) * qscale *
2292 ((int) (quant_matrix[j]))) >> 4;
2295 level = (((level << 1) + 1) * qscale *
2296 ((int) (quant_matrix[j]))) >> 4;
2305 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2306 DCTELEM *block, int n, int qscale)
2308 int i, level, qmul, qadd;
2311 assert(s->block_last_index[n]>=0);
2317 block[0] = block[0] * s->y_dc_scale;
2319 block[0] = block[0] * s->c_dc_scale;
2320 qadd = (qscale - 1) | 1;
2327 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2329 for(i=1; i<=nCoeffs; i++) {
2333 level = level * qmul - qadd;
2335 level = level * qmul + qadd;
2342 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2343 DCTELEM *block, int n, int qscale)
2345 int i, level, qmul, qadd;
2348 assert(s->block_last_index[n]>=0);
2350 qadd = (qscale - 1) | 1;
2353 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2355 for(i=0; i<=nCoeffs; i++) {
2359 level = level * qmul - qadd;
2361 level = level * qmul + qadd;
2369 * set qscale and update qscale dependent variables.
2371 void ff_set_qscale(MpegEncContext * s, int qscale)
2375 else if (qscale > 31)
2379 s->chroma_qscale= s->chroma_qscale_table[qscale];
2381 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2382 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];