2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
24 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
33 #include "fastmemcpy.h"
39 #ifdef CONFIG_ENCODERS
40 static void encode_picture(MpegEncContext *s, int picture_number);
41 #endif //CONFIG_ENCODERS
42 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
43 DCTELEM *block, int n, int qscale);
44 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_h263_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
49 #ifdef CONFIG_ENCODERS
50 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
51 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
52 static int sse_mb(MpegEncContext *s);
53 #endif //CONFIG_ENCODERS
56 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
57 extern void XVMC_field_end(MpegEncContext *s);
58 extern void XVMC_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
61 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
64 /* enable all paranoid tests for rounding, overflows, etc... */
70 /* for jpeg fast DCT */
73 static const uint16_t aanscales[64] = {
74 /* precomputed values scaled up by 14 bits */
75 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
76 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
77 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
78 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
79 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
80 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
81 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
82 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
85 static const uint8_t h263_chroma_roundtab[16] = {
86 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
87 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
90 #ifdef CONFIG_ENCODERS
91 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
92 static uint8_t default_fcode_tab[MAX_MV*2+1];
94 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
96 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64],
97 const uint16_t *quant_matrix, int bias, int qmin, int qmax)
101 for(qscale=qmin; qscale<=qmax; qscale++){
103 if (s->dsp.fdct == ff_jpeg_fdct_islow) {
105 const int j= s->dsp.idct_permutation[i];
106 /* 16 <= qscale * quant_matrix[i] <= 7905 */
107 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
108 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
109 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
111 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
112 (qscale * quant_matrix[j]));
114 } else if (s->dsp.fdct == fdct_ifast) {
116 const int j= s->dsp.idct_permutation[i];
117 /* 16 <= qscale * quant_matrix[i] <= 7905 */
118 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
119 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
120 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
122 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
123 (aanscales[i] * qscale * quant_matrix[j]));
127 const int j= s->dsp.idct_permutation[i];
128 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
129 So 16 <= qscale * quant_matrix[i] <= 7905
130 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
131 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
133 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
134 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
135 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
137 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1;
138 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]);
143 #endif //CONFIG_ENCODERS
145 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
149 st->scantable= src_scantable;
153 j = src_scantable[i];
154 st->permutated[i] = permutation[j];
163 j = st->permutated[i];
165 st->raster_end[i]= end;
169 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
175 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
181 /* init common dct for both encoder and decoder */
182 int DCT_common_init(MpegEncContext *s)
184 s->dct_unquantize_h263 = dct_unquantize_h263_c;
185 s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c;
186 s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c;
188 #ifdef CONFIG_ENCODERS
189 s->dct_quantize= dct_quantize_c;
193 MPV_common_init_mmx(s);
196 MPV_common_init_axp(s);
199 MPV_common_init_mlib(s);
202 MPV_common_init_mmi(s);
205 MPV_common_init_armv4l(s);
208 MPV_common_init_ppc(s);
211 #ifdef CONFIG_ENCODERS
212 s->fast_dct_quantize= s->dct_quantize;
214 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
215 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
218 #endif //CONFIG_ENCODERS
220 /* load & permutate scantables
221 note: only wmv uses differnt ones
223 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
224 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
225 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
226 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
228 s->picture_structure= PICT_FRAME;
234 * allocates a Picture
235 * The pixels are allocated/set by calling get_buffer() if shared=0
237 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
238 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
239 const int mb_array_size= s->mb_stride*s->mb_height;
243 assert(pic->data[0]);
244 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
245 pic->type= FF_BUFFER_TYPE_SHARED;
249 assert(!pic->data[0]);
251 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
253 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
254 fprintf(stderr, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
258 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
259 fprintf(stderr, "get_buffer() failed (stride changed)\n");
263 if(pic->linesize[1] != pic->linesize[2]){
264 fprintf(stderr, "get_buffer() failed (uv stride missmatch)\n");
268 s->linesize = pic->linesize[0];
269 s->uvlinesize= pic->linesize[1];
272 if(pic->qscale_table==NULL){
274 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
275 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
276 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
277 CHECKED_ALLOCZ(pic->mb_cmp_score, mb_array_size * sizeof(int32_t))
280 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
281 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
282 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(int))
283 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
284 if(s->out_format == FMT_H264){
286 CHECKED_ALLOCZ(pic->motion_val[i], 2 * 16 * s->mb_num * sizeof(uint16_t))
287 CHECKED_ALLOCZ(pic->ref_index[i] , 4 * s->mb_num * sizeof(uint8_t))
290 pic->qstride= s->mb_stride;
293 //it might be nicer if the application would keep track of these but it would require a API change
294 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
295 s->prev_pict_types[0]= s->pict_type;
296 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
297 pic->age= INT_MAX; // skiped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
300 fail: //for the CHECKED_ALLOCZ macro
305 * deallocates a picture
307 static void free_picture(MpegEncContext *s, Picture *pic){
310 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
311 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
314 av_freep(&pic->mb_var);
315 av_freep(&pic->mc_mb_var);
316 av_freep(&pic->mb_mean);
317 av_freep(&pic->mb_cmp_score);
318 av_freep(&pic->mbskip_table);
319 av_freep(&pic->qscale_table);
320 av_freep(&pic->mb_type_base);
323 av_freep(&pic->motion_val[i]);
324 av_freep(&pic->ref_index[i]);
327 if(pic->type == FF_BUFFER_TYPE_SHARED){
336 /* init common structure for both encoder and decoder */
337 int MPV_common_init(MpegEncContext *s)
339 int y_size, c_size, yc_size, i, mb_array_size, x, y;
341 dsputil_init(&s->dsp, s->avctx);
344 s->flags= s->avctx->flags;
346 s->mb_width = (s->width + 15) / 16;
347 s->mb_height = (s->height + 15) / 16;
348 s->mb_stride = s->mb_width + 1;
349 mb_array_size= s->mb_height * s->mb_stride;
351 /* set default edge pos, will be overriden in decode_header if needed */
352 s->h_edge_pos= s->mb_width*16;
353 s->v_edge_pos= s->mb_height*16;
355 s->mb_num = s->mb_width * s->mb_height;
360 s->block_wrap[3]= s->mb_width*2 + 2;
362 s->block_wrap[5]= s->mb_width + 2;
364 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
365 c_size = (s->mb_width + 2) * (s->mb_height + 2);
366 yc_size = y_size + 2 * c_size;
368 /* convert fourcc to upper case */
369 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
370 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
371 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
372 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
374 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
375 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
376 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
377 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
379 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
380 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
382 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
384 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
385 for(y=0; y<s->mb_height; y++){
386 for(x=0; x<s->mb_width; x++){
387 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
390 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
393 int mv_table_size= s->mb_stride * (s->mb_height+2) + 1;
395 /* Allocate MV tables */
396 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
397 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
398 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
399 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
400 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
401 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
402 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
403 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
404 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
405 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
406 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
407 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
409 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
410 CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*3*sizeof(uint8_t))
412 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
413 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
415 if(s->codec_id==CODEC_ID_MPEG4){
416 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);
417 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE);
420 if(s->msmpeg4_version){
421 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
423 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
425 /* Allocate MB type table */
426 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint8_t)) //needed for encoding
429 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
431 if (s->out_format == FMT_H263 || s->encoding) {
435 size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
436 CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(int16_t));
439 if(s->codec_id==CODEC_ID_MPEG4){
440 /* interlaced direct mode decoding tables */
441 CHECKED_ALLOCZ(s->field_mv_table, mb_array_size*2*2 * sizeof(int16_t))
442 CHECKED_ALLOCZ(s->field_select_table, mb_array_size*2* sizeof(int8_t))
444 if (s->out_format == FMT_H263) {
446 CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16);
447 s->ac_val[1] = s->ac_val[0] + y_size;
448 s->ac_val[2] = s->ac_val[1] + c_size;
451 CHECKED_ALLOCZ(s->coded_block, y_size);
453 /* divx501 bitstream reorder buffer */
454 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
456 /* cbp, ac_pred, pred_dir */
457 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
458 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
461 if (s->h263_pred || s->h263_plus || !s->encoding) {
463 //MN: we need these for error resilience of intra-frames
464 CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(int16_t));
465 s->dc_val[1] = s->dc_val[0] + y_size;
466 s->dc_val[2] = s->dc_val[1] + c_size;
467 for(i=0;i<yc_size;i++)
468 s->dc_val[0][i] = 1024;
471 /* which mb is a intra block */
472 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
473 memset(s->mbintra_table, 1, mb_array_size);
475 /* default structure is frame */
476 s->picture_structure = PICT_FRAME;
478 /* init macroblock skip table */
479 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
480 //Note the +1 is for a quicker mpeg4 slice_end detection
481 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
483 s->block= s->blocks[0];
485 s->parse_context.state= -1;
487 s->context_initialized = 1;
497 /* init common structure for both encoder and decoder */
498 void MPV_common_end(MpegEncContext *s)
502 av_freep(&s->parse_context.buffer);
503 s->parse_context.buffer_size=0;
505 av_freep(&s->mb_type);
506 av_freep(&s->p_mv_table_base);
507 av_freep(&s->b_forw_mv_table_base);
508 av_freep(&s->b_back_mv_table_base);
509 av_freep(&s->b_bidir_forw_mv_table_base);
510 av_freep(&s->b_bidir_back_mv_table_base);
511 av_freep(&s->b_direct_mv_table_base);
513 s->b_forw_mv_table= NULL;
514 s->b_back_mv_table= NULL;
515 s->b_bidir_forw_mv_table= NULL;
516 s->b_bidir_back_mv_table= NULL;
517 s->b_direct_mv_table= NULL;
519 av_freep(&s->motion_val);
520 av_freep(&s->dc_val[0]);
521 av_freep(&s->ac_val[0]);
522 av_freep(&s->coded_block);
523 av_freep(&s->mbintra_table);
524 av_freep(&s->cbp_table);
525 av_freep(&s->pred_dir_table);
526 av_freep(&s->me.scratchpad);
527 av_freep(&s->me.map);
528 av_freep(&s->me.score_map);
530 av_freep(&s->mbskip_table);
531 av_freep(&s->prev_pict_types);
532 av_freep(&s->bitstream_buffer);
533 av_freep(&s->tex_pb_buffer);
534 av_freep(&s->pb2_buffer);
535 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
536 av_freep(&s->field_mv_table);
537 av_freep(&s->field_select_table);
538 av_freep(&s->avctx->stats_out);
539 av_freep(&s->ac_stats);
540 av_freep(&s->error_status_table);
541 av_freep(&s->mb_index2xy);
543 for(i=0; i<MAX_PICTURE_COUNT; i++){
544 free_picture(s, &s->picture[i]);
546 avcodec_default_free_buffers(s->avctx);
547 s->context_initialized = 0;
550 #ifdef CONFIG_ENCODERS
552 /* init video encoder */
553 int MPV_encode_init(AVCodecContext *avctx)
555 MpegEncContext *s = avctx->priv_data;
557 int chroma_h_shift, chroma_v_shift;
559 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
561 s->bit_rate = avctx->bit_rate;
562 s->bit_rate_tolerance = avctx->bit_rate_tolerance;
563 s->width = avctx->width;
564 s->height = avctx->height;
565 if(avctx->gop_size > 600){
566 fprintf(stderr, "Warning keyframe interval too large! reducing it ...\n");
569 s->gop_size = avctx->gop_size;
570 s->rtp_mode = avctx->rtp_mode;
571 s->rtp_payload_size = avctx->rtp_payload_size;
572 if (avctx->rtp_callback)
573 s->rtp_callback = avctx->rtp_callback;
574 s->max_qdiff= avctx->max_qdiff;
575 s->qcompress= avctx->qcompress;
576 s->qblur= avctx->qblur;
578 s->flags= avctx->flags;
579 s->max_b_frames= avctx->max_b_frames;
580 s->b_frame_strategy= avctx->b_frame_strategy;
581 s->codec_id= avctx->codec->id;
582 s->luma_elim_threshold = avctx->luma_elim_threshold;
583 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
584 s->strict_std_compliance= avctx->strict_std_compliance;
585 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
586 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
587 s->mpeg_quant= avctx->mpeg_quant;
589 if (s->gop_size <= 1) {
596 s->me_method = avctx->me_method;
599 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
601 s->adaptive_quant= ( s->avctx->lumi_masking
602 || s->avctx->dark_masking
603 || s->avctx->temporal_cplx_masking
604 || s->avctx->spatial_cplx_masking
605 || s->avctx->p_masking)
608 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT);
610 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4){
611 fprintf(stderr, "4MV not supporetd by codec\n");
615 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
616 fprintf(stderr, "qpel not supporetd by codec\n");
620 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
621 fprintf(stderr, "data partitioning not supporetd by codec\n");
625 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
626 fprintf(stderr, "b frames not supporetd by codec\n");
630 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
631 fprintf(stderr, "mpeg2 style quantization not supporetd by codec\n");
635 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
636 fprintf(stderr, "CBP RD needs trellis quant\n");
640 if(s->codec_id==CODEC_ID_MJPEG){
641 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
642 s->inter_quant_bias= 0;
643 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
644 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
645 s->inter_quant_bias= 0;
647 s->intra_quant_bias=0;
648 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
651 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
652 s->intra_quant_bias= avctx->intra_quant_bias;
653 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
654 s->inter_quant_bias= avctx->inter_quant_bias;
656 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
658 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
659 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
661 switch(avctx->codec->id) {
662 case CODEC_ID_MPEG1VIDEO:
663 s->out_format = FMT_MPEG1;
664 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
665 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
667 case CODEC_ID_MPEG2VIDEO:
668 s->out_format = FMT_MPEG1;
669 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
670 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
671 s->rtp_mode= 1; // mpeg2 must have slices
672 if(s->rtp_payload_size == 0) s->rtp_payload_size= 256*256*256;
676 s->out_format = FMT_MJPEG;
677 s->intra_only = 1; /* force intra only for jpeg */
678 s->mjpeg_write_tables = 1; /* write all tables */
679 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
680 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
681 s->mjpeg_vsample[1] = 1;
682 s->mjpeg_vsample[2] = 1;
683 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
684 s->mjpeg_hsample[1] = 1;
685 s->mjpeg_hsample[2] = 1;
686 if (mjpeg_init(s) < 0)
693 if (h263_get_picture_format(s->width, s->height) == 7) {
694 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
697 s->out_format = FMT_H263;
702 s->out_format = FMT_H263;
705 s->unrestricted_mv=(avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
706 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
708 /* These are just to be sure */
714 s->out_format = FMT_H263;
715 s->h263_flv = 2; /* format = 1; 11-bit codes */
716 s->unrestricted_mv = 1;
717 s->rtp_mode=0; /* don't allow GOB */
722 s->out_format = FMT_H263;
728 s->out_format = FMT_H263;
730 s->unrestricted_mv = 1;
731 s->low_delay= s->max_b_frames ? 0 : 1;
732 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
734 case CODEC_ID_MSMPEG4V1:
735 s->out_format = FMT_H263;
738 s->unrestricted_mv = 1;
739 s->msmpeg4_version= 1;
743 case CODEC_ID_MSMPEG4V2:
744 s->out_format = FMT_H263;
747 s->unrestricted_mv = 1;
748 s->msmpeg4_version= 2;
752 case CODEC_ID_MSMPEG4V3:
753 s->out_format = FMT_H263;
756 s->unrestricted_mv = 1;
757 s->msmpeg4_version= 3;
758 s->flipflop_rounding=1;
763 s->out_format = FMT_H263;
766 s->unrestricted_mv = 1;
767 s->msmpeg4_version= 4;
768 s->flipflop_rounding=1;
773 s->out_format = FMT_H263;
776 s->unrestricted_mv = 1;
777 s->msmpeg4_version= 5;
778 s->flipflop_rounding=1;
787 { /* set up some save defaults, some codecs might override them later */
793 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
794 memset(default_mv_penalty, 0, sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1));
795 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
797 for(i=-16; i<16; i++){
798 default_fcode_tab[i + MAX_MV]= 1;
802 s->me.mv_penalty= default_mv_penalty;
803 s->fcode_tab= default_fcode_tab;
805 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
807 /* dont use mv_penalty table for crap MV as it would be confused */
808 //FIXME remove after fixing / removing old ME
809 if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty;
814 if (MPV_common_init(s) < 0)
819 #ifdef CONFIG_ENCODERS
821 if (s->out_format == FMT_H263)
823 if(s->msmpeg4_version)
824 ff_msmpeg4_encode_init(s);
826 if (s->out_format == FMT_MPEG1)
827 ff_mpeg1_encode_init(s);
830 /* init default q matrix */
832 int j= s->dsp.idct_permutation[i];
834 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
835 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
836 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
837 }else if(s->out_format == FMT_H263){
839 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
843 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
844 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
846 if(s->avctx->intra_matrix)
847 s->intra_matrix[j] = s->avctx->intra_matrix[i];
848 if(s->avctx->inter_matrix)
849 s->inter_matrix[j] = s->avctx->inter_matrix[i];
852 /* precompute matrix */
853 /* for mjpeg, we do include qscale in the matrix */
854 if (s->out_format != FMT_MJPEG) {
855 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16, s->q_intra_matrix16_bias,
856 s->intra_matrix, s->intra_quant_bias, 1, 31);
857 convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16, s->q_inter_matrix16_bias,
858 s->inter_matrix, s->inter_quant_bias, 1, 31);
861 if(ff_rate_control_init(s) < 0)
864 s->picture_number = 0;
865 s->picture_in_gop_number = 0;
866 s->fake_picture_number = 0;
867 /* motion detector init */
874 int MPV_encode_end(AVCodecContext *avctx)
876 MpegEncContext *s = avctx->priv_data;
882 ff_rate_control_uninit(s);
885 if (s->out_format == FMT_MJPEG)
888 av_freep(&avctx->extradata);
893 #endif //CONFIG_ENCODERS
895 void init_rl(RLTable *rl)
897 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
898 uint8_t index_run[MAX_RUN+1];
899 int last, run, level, start, end, i;
901 /* compute max_level[], max_run[] and index_run[] */
902 for(last=0;last<2;last++) {
911 memset(max_level, 0, MAX_RUN + 1);
912 memset(max_run, 0, MAX_LEVEL + 1);
913 memset(index_run, rl->n, MAX_RUN + 1);
914 for(i=start;i<end;i++) {
915 run = rl->table_run[i];
916 level = rl->table_level[i];
917 if (index_run[run] == rl->n)
919 if (level > max_level[run])
920 max_level[run] = level;
921 if (run > max_run[level])
922 max_run[level] = run;
924 rl->max_level[last] = av_malloc(MAX_RUN + 1);
925 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
926 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
927 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
928 rl->index_run[last] = av_malloc(MAX_RUN + 1);
929 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
933 /* draw the edges of width 'w' of an image of size width, height */
934 //FIXME check that this is ok for mpeg4 interlaced
935 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
937 uint8_t *ptr, *last_line;
940 last_line = buf + (height - 1) * wrap;
943 memcpy(buf - (i + 1) * wrap, buf, width);
944 memcpy(last_line + (i + 1) * wrap, last_line, width);
948 for(i=0;i<height;i++) {
949 memset(ptr - w, ptr[0], w);
950 memset(ptr + width, ptr[width-1], w);
955 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
956 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
957 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
958 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
962 static int find_unused_picture(MpegEncContext *s, int shared){
966 for(i=0; i<MAX_PICTURE_COUNT; i++){
967 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) break;
970 for(i=0; i<MAX_PICTURE_COUNT; i++){
971 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) break; //FIXME
973 for(i=0; i<MAX_PICTURE_COUNT; i++){
974 if(s->picture[i].data[0]==NULL) break;
978 assert(i<MAX_PICTURE_COUNT);
982 /* generic function for encode/decode called before a frame is coded/decoded */
983 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
990 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
992 /* mark&release old frames */
993 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr->data[0]) {
994 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
996 /* release forgotten pictures */
997 /* if(mpeg124/h263) */
999 for(i=0; i<MAX_PICTURE_COUNT; i++){
1000 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1001 fprintf(stderr, "releasing zombie picture\n");
1002 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1009 /* release non refernce frames */
1010 for(i=0; i<MAX_PICTURE_COUNT; i++){
1011 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1012 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1016 i= find_unused_picture(s, 0);
1018 pic= (AVFrame*)&s->picture[i];
1019 pic->reference= s->pict_type != B_TYPE ? 3 : 0;
1021 if(s->current_picture_ptr)
1022 pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1;
1024 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1027 s->current_picture_ptr= &s->picture[i];
1030 s->current_picture_ptr->pict_type= s->pict_type;
1031 s->current_picture_ptr->quality= s->qscale;
1032 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1034 s->current_picture= *s->current_picture_ptr;
1036 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1037 if (s->pict_type != B_TYPE) {
1038 s->last_picture_ptr= s->next_picture_ptr;
1039 s->next_picture_ptr= s->current_picture_ptr;
1042 if(s->last_picture_ptr) s->last_picture= *s->last_picture_ptr;
1043 if(s->next_picture_ptr) s->next_picture= *s->next_picture_ptr;
1044 if(s->new_picture_ptr ) s->new_picture = *s->new_picture_ptr;
1046 if(s->pict_type != I_TYPE && s->last_picture_ptr==NULL){
1047 fprintf(stderr, "warning: first frame is no keyframe\n");
1048 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1052 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1054 if(s->picture_structure!=PICT_FRAME){
1057 if(s->picture_structure == PICT_BOTTOM_FIELD){
1058 s->current_picture.data[i] += s->current_picture.linesize[i];
1060 s->current_picture.linesize[i] *= 2;
1061 s->last_picture.linesize[i] *=2;
1062 s->next_picture.linesize[i] *=2;
1067 s->hurry_up= s->avctx->hurry_up;
1068 s->error_resilience= avctx->error_resilience;
1070 /* set dequantizer, we cant do it during init as it might change for mpeg4
1071 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1072 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO)
1073 s->dct_unquantize = s->dct_unquantize_mpeg2;
1074 else if(s->out_format == FMT_H263)
1075 s->dct_unquantize = s->dct_unquantize_h263;
1077 s->dct_unquantize = s->dct_unquantize_mpeg1;
1080 if(s->avctx->xvmc_acceleration)
1081 return XVMC_field_start(s, avctx);
1086 /* generic function for encode/decode called after a frame has been coded/decoded */
1087 void MPV_frame_end(MpegEncContext *s)
1090 /* draw edge for correct motion prediction if outside */
1092 //just to make sure that all data is rendered.
1093 if(s->avctx->xvmc_acceleration){
1097 if(s->codec_id!=CODEC_ID_SVQ1 && s->out_format != FMT_MPEG1){
1098 if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1099 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1100 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1101 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1106 s->last_pict_type = s->pict_type;
1107 if(s->pict_type!=B_TYPE){
1108 s->last_non_b_pict_type= s->pict_type;
1111 /* copy back current_picture variables */
1112 for(i=0; i<MAX_PICTURE_COUNT; i++){
1113 if(s->picture[i].data[0] == s->current_picture.data[0]){
1114 s->picture[i]= s->current_picture;
1118 assert(i<MAX_PICTURE_COUNT);
1122 /* release non refernce frames */
1123 for(i=0; i<MAX_PICTURE_COUNT; i++){
1124 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1125 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1129 // clear copies, to avoid confusion
1131 memset(&s->last_picture, 0, sizeof(Picture));
1132 memset(&s->next_picture, 0, sizeof(Picture));
1133 memset(&s->current_picture, 0, sizeof(Picture));
1138 * draws an line from (ex, ey) -> (sx, sy).
1139 * @param w width of the image
1140 * @param h height of the image
1141 * @param stride stride/linesize of the image
1142 * @param color color of the arrow
1144 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1147 sx= clip(sx, 0, w-1);
1148 sy= clip(sy, 0, h-1);
1149 ex= clip(ex, 0, w-1);
1150 ey= clip(ey, 0, h-1);
1152 buf[sy*stride + sx]+= color;
1154 if(ABS(ex - sx) > ABS(ey - sy)){
1159 buf+= sx + sy*stride;
1161 f= ((ey-sy)<<16)/ex;
1162 for(x= 0; x <= ex; x++){
1163 y= ((x*f) + (1<<15))>>16;
1164 buf[y*stride + x]+= color;
1171 buf+= sx + sy*stride;
1173 if(ey) f= ((ex-sx)<<16)/ey;
1175 for(y= 0; y <= ey; y++){
1176 x= ((y*f) + (1<<15))>>16;
1177 buf[y*stride + x]+= color;
1183 * draws an arrow from (ex, ey) -> (sx, sy).
1184 * @param w width of the image
1185 * @param h height of the image
1186 * @param stride stride/linesize of the image
1187 * @param color color of the arrow
1189 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1192 sx= clip(sx, -100, w+100);
1193 sy= clip(sy, -100, h+100);
1194 ex= clip(ex, -100, w+100);
1195 ey= clip(ey, -100, h+100);
1200 if(dx*dx + dy*dy > 3*3){
1203 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1205 //FIXME subpixel accuracy
1206 rx= ROUNDED_DIV(rx*3<<4, length);
1207 ry= ROUNDED_DIV(ry*3<<4, length);
1209 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1210 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1212 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1216 * prints debuging info for the given picture.
1218 void ff_print_debug_info(MpegEncContext *s, Picture *pict){
1220 if(!pict || !pict->mb_type) return;
1222 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1225 for(y=0; y<s->mb_height; y++){
1226 for(x=0; x<s->mb_width; x++){
1227 if(s->avctx->debug&FF_DEBUG_SKIP){
1228 int count= s->mbskip_table[x + y*s->mb_stride];
1229 if(count>9) count=9;
1230 printf("%1d", count);
1232 if(s->avctx->debug&FF_DEBUG_QP){
1233 printf("%2d", pict->qscale_table[x + y*s->mb_stride]);
1235 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1236 int mb_type= pict->mb_type[x + y*s->mb_stride];
1238 //Type & MV direction
1241 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1243 else if(IS_INTRA4x4(mb_type))
1245 else if(IS_INTRA16x16(mb_type))
1247 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1249 else if(IS_DIRECT(mb_type))
1251 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1253 else if(IS_GMC(mb_type))
1255 else if(IS_SKIP(mb_type))
1257 else if(!USES_LIST(mb_type, 1))
1259 else if(!USES_LIST(mb_type, 0))
1262 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1269 else if(IS_16X8(mb_type))
1271 else if(IS_8X16(mb_type))
1273 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1279 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1290 if((s->avctx->debug&FF_DEBUG_VIS_MV) && s->motion_val){
1291 const int shift= 1 + s->quarter_sample;
1293 uint8_t *ptr= pict->data[0];
1294 s->low_delay=0; //needed to see the vectors without trashing the buffers
1296 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1298 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1299 const int mb_index= mb_x + mb_y*s->mb_stride;
1300 if(IS_8X8(s->current_picture.mb_type[mb_index])){
1303 int sx= mb_x*16 + 4 + 8*(i&1);
1304 int sy= mb_y*16 + 4 + 8*(i>>1);
1305 int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2);
1306 int mx= (s->motion_val[xy][0]>>shift) + sx;
1307 int my= (s->motion_val[xy][1]>>shift) + sy;
1308 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1311 int sx= mb_x*16 + 8;
1312 int sy= mb_y*16 + 8;
1313 int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2);
1314 int mx= (s->motion_val[xy][0]>>shift) + sx;
1315 int my= (s->motion_val[xy][1]>>shift) + sy;
1316 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1318 s->mbskip_table[mb_index]=0;
1324 #ifdef CONFIG_ENCODERS
1326 static int get_sae(uint8_t *src, int ref, int stride){
1330 for(y=0; y<16; y++){
1331 for(x=0; x<16; x++){
1332 acc+= ABS(src[x+y*stride] - ref);
1339 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1346 for(y=0; y<h; y+=16){
1347 for(x=0; x<w; x+=16){
1348 int offset= x + y*stride;
1349 int sad = s->dsp.pix_abs16x16(src + offset, ref + offset, stride);
1350 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1351 int sae = get_sae(src + offset, mean, stride);
1353 acc+= sae + 500 < sad;
1360 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1363 const int encoding_delay= s->max_b_frames;
1367 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1368 if(pic_arg->linesize[0] != s->linesize) direct=0;
1369 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1370 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1372 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1375 i= find_unused_picture(s, 1);
1377 pic= (AVFrame*)&s->picture[i];
1381 pic->data[i]= pic_arg->data[i];
1382 pic->linesize[i]= pic_arg->linesize[i];
1384 alloc_picture(s, (Picture*)pic, 1);
1386 i= find_unused_picture(s, 0);
1388 pic= (AVFrame*)&s->picture[i];
1391 alloc_picture(s, (Picture*)pic, 0);
1393 /* the input will be 16 pixels to the right relative to the actual buffer start
1394 * and the current_pic, so the buffer can be reused, yes its not beatifull
1399 if( pic->data[0] == pic_arg->data[0]
1400 && pic->data[1] == pic_arg->data[1]
1401 && pic->data[2] == pic_arg->data[2]){
1404 int h_chroma_shift, v_chroma_shift;
1405 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1408 int src_stride= pic_arg->linesize[i];
1409 int dst_stride= i ? s->uvlinesize : s->linesize;
1410 int h_shift= i ? h_chroma_shift : 0;
1411 int v_shift= i ? v_chroma_shift : 0;
1412 int w= s->width >>h_shift;
1413 int h= s->height>>v_shift;
1414 uint8_t *src= pic_arg->data[i];
1415 uint8_t *dst= pic->data[i];
1417 if(src_stride==dst_stride)
1418 memcpy(dst, src, src_stride*h);
1421 memcpy(dst, src, w);
1429 pic->quality= pic_arg->quality;
1430 pic->pict_type= pic_arg->pict_type;
1431 pic->pts = pic_arg->pts;
1433 if(s->input_picture[encoding_delay])
1434 pic->display_picture_number= s->input_picture[encoding_delay]->display_picture_number + 1;
1438 /* shift buffer entries */
1439 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1440 s->input_picture[i-1]= s->input_picture[i];
1442 s->input_picture[encoding_delay]= (Picture*)pic;
1447 static void select_input_picture(MpegEncContext *s){
1449 int coded_pic_num=0;
1451 if(s->reordered_input_picture[0])
1452 coded_pic_num= s->reordered_input_picture[0]->coded_picture_number + 1;
1454 for(i=1; i<MAX_PICTURE_COUNT; i++)
1455 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
1456 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
1458 /* set next picture types & ordering */
1459 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
1460 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
1461 s->reordered_input_picture[0]= s->input_picture[0];
1462 s->reordered_input_picture[0]->pict_type= I_TYPE;
1463 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1467 if(s->flags&CODEC_FLAG_PASS2){
1468 for(i=0; i<s->max_b_frames+1; i++){
1469 int pict_num= s->input_picture[0]->display_picture_number + i;
1470 int pict_type= s->rc_context.entry[pict_num].new_pict_type;
1471 s->input_picture[i]->pict_type= pict_type;
1473 if(i + 1 >= s->rc_context.num_entries) break;
1477 if(s->input_picture[0]->pict_type){
1478 /* user selected pict_type */
1479 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
1480 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
1483 if(b_frames > s->max_b_frames){
1484 fprintf(stderr, "warning, too many bframes in a row\n");
1485 b_frames = s->max_b_frames;
1487 }else if(s->b_frame_strategy==0){
1488 b_frames= s->max_b_frames;
1489 while(b_frames && !s->input_picture[b_frames]) b_frames--;
1490 }else if(s->b_frame_strategy==1){
1491 for(i=1; i<s->max_b_frames+1; i++){
1492 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
1493 s->input_picture[i]->b_frame_score=
1494 get_intra_count(s, s->input_picture[i ]->data[0],
1495 s->input_picture[i-1]->data[0], s->linesize) + 1;
1498 for(i=0; i<s->max_b_frames; i++){
1499 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
1502 b_frames= FFMAX(0, i-1);
1505 for(i=0; i<b_frames+1; i++){
1506 s->input_picture[i]->b_frame_score=0;
1509 fprintf(stderr, "illegal b frame strategy\n");
1514 //static int b_count=0;
1515 //b_count+= b_frames;
1516 //printf("b_frames: %d\n", b_count);
1518 s->reordered_input_picture[0]= s->input_picture[b_frames];
1519 if( s->picture_in_gop_number + b_frames >= s->gop_size
1520 || s->reordered_input_picture[0]->pict_type== I_TYPE)
1521 s->reordered_input_picture[0]->pict_type= I_TYPE;
1523 s->reordered_input_picture[0]->pict_type= P_TYPE;
1524 s->reordered_input_picture[0]->coded_picture_number= coded_pic_num;
1525 for(i=0; i<b_frames; i++){
1527 s->reordered_input_picture[i+1]= s->input_picture[i];
1528 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
1529 s->reordered_input_picture[i+1]->coded_picture_number= coded_pic_num;
1534 if(s->reordered_input_picture[0]){
1535 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
1537 s->new_picture= *s->reordered_input_picture[0];
1539 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
1540 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
1542 int i= find_unused_picture(s, 0);
1543 Picture *pic= &s->picture[i];
1545 /* mark us unused / free shared pic */
1547 s->reordered_input_picture[0]->data[i]= NULL;
1548 s->reordered_input_picture[0]->type= 0;
1550 //FIXME bad, copy * except
1551 pic->pict_type = s->reordered_input_picture[0]->pict_type;
1552 pic->quality = s->reordered_input_picture[0]->quality;
1553 pic->coded_picture_number = s->reordered_input_picture[0]->coded_picture_number;
1554 pic->reference = s->reordered_input_picture[0]->reference;
1555 pic->pts = s->reordered_input_picture[0]->pts;
1557 alloc_picture(s, pic, 0);
1559 s->current_picture_ptr= pic;
1561 // input is not a shared pix -> reuse buffer for current_pix
1563 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
1564 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
1566 s->current_picture_ptr= s->reordered_input_picture[0];
1568 //reverse the +16 we did before storing the input
1569 s->current_picture_ptr->data[i]-=16;
1572 s->current_picture= *s->current_picture_ptr;
1574 s->picture_number= s->new_picture.display_picture_number;
1575 //printf("dpn:%d\n", s->picture_number);
1577 memset(&s->new_picture, 0, sizeof(Picture));
1581 int MPV_encode_picture(AVCodecContext *avctx,
1582 unsigned char *buf, int buf_size, void *data)
1584 MpegEncContext *s = avctx->priv_data;
1585 AVFrame *pic_arg = data;
1588 if(avctx->pix_fmt != PIX_FMT_YUV420P){
1589 fprintf(stderr, "this codec supports only YUV420P\n");
1593 init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
1595 s->picture_in_gop_number++;
1597 load_input_picture(s, pic_arg);
1599 select_input_picture(s);
1602 if(s->new_picture.data[0]){
1604 s->pict_type= s->new_picture.pict_type;
1605 if (s->fixed_qscale){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */
1606 s->qscale= (int)(s->new_picture.quality+0.5);
1610 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
1611 MPV_frame_start(s, avctx);
1613 encode_picture(s, s->picture_number);
1615 avctx->real_pict_num = s->picture_number;
1616 avctx->header_bits = s->header_bits;
1617 avctx->mv_bits = s->mv_bits;
1618 avctx->misc_bits = s->misc_bits;
1619 avctx->i_tex_bits = s->i_tex_bits;
1620 avctx->p_tex_bits = s->p_tex_bits;
1621 avctx->i_count = s->i_count;
1622 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
1623 avctx->skip_count = s->skip_count;
1627 if (s->out_format == FMT_MJPEG)
1628 mjpeg_picture_trailer(s);
1630 if(s->flags&CODEC_FLAG_PASS1)
1631 ff_write_pass1_stats(s);
1634 avctx->error[i] += s->current_picture_ptr->error[i];
1638 s->input_picture_number++;
1640 flush_put_bits(&s->pb);
1641 s->frame_bits = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
1643 s->total_bits += s->frame_bits;
1644 avctx->frame_bits = s->frame_bits;
1646 return pbBufPtr(&s->pb) - s->pb.buf;
1649 #endif //CONFIG_ENCODERS
1651 static inline void gmc1_motion(MpegEncContext *s,
1652 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1654 uint8_t **ref_picture, int src_offset)
1657 int offset, src_x, src_y, linesize, uvlinesize;
1658 int motion_x, motion_y;
1661 motion_x= s->sprite_offset[0][0];
1662 motion_y= s->sprite_offset[0][1];
1663 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
1664 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
1665 motion_x<<=(3-s->sprite_warping_accuracy);
1666 motion_y<<=(3-s->sprite_warping_accuracy);
1667 src_x = clip(src_x, -16, s->width);
1668 if (src_x == s->width)
1670 src_y = clip(src_y, -16, s->height);
1671 if (src_y == s->height)
1674 linesize = s->linesize;
1675 uvlinesize = s->uvlinesize;
1677 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1679 dest_y+=dest_offset;
1680 if(s->flags&CODEC_FLAG_EMU_EDGE){
1681 if(src_x<0 || src_y<0 || src_x + 17 >= s->h_edge_pos
1682 || src_y + 17 >= s->v_edge_pos){
1683 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1684 ptr= s->edge_emu_buffer;
1688 if((motion_x|motion_y)&7){
1689 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
1690 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
1694 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
1695 if (s->no_rounding){
1696 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
1698 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
1702 if(s->flags&CODEC_FLAG_GRAY) return;
1704 motion_x= s->sprite_offset[1][0];
1705 motion_y= s->sprite_offset[1][1];
1706 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
1707 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
1708 motion_x<<=(3-s->sprite_warping_accuracy);
1709 motion_y<<=(3-s->sprite_warping_accuracy);
1710 src_x = clip(src_x, -8, s->width>>1);
1711 if (src_x == s->width>>1)
1713 src_y = clip(src_y, -8, s->height>>1);
1714 if (src_y == s->height>>1)
1717 offset = (src_y * uvlinesize) + src_x + (src_offset>>1);
1718 ptr = ref_picture[1] + offset;
1719 if(s->flags&CODEC_FLAG_EMU_EDGE){
1720 if(src_x<0 || src_y<0 || src_x + 9 >= s->h_edge_pos>>1
1721 || src_y + 9 >= s->v_edge_pos>>1){
1722 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1723 ptr= s->edge_emu_buffer;
1727 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1729 ptr = ref_picture[2] + offset;
1731 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
1732 ptr= s->edge_emu_buffer;
1734 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
1739 static inline void gmc_motion(MpegEncContext *s,
1740 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1742 uint8_t **ref_picture, int src_offset)
1745 int linesize, uvlinesize;
1746 const int a= s->sprite_warping_accuracy;
1749 linesize = s->linesize;
1750 uvlinesize = s->uvlinesize;
1752 ptr = ref_picture[0] + src_offset;
1754 dest_y+=dest_offset;
1756 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
1757 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
1759 s->dsp.gmc(dest_y, ptr, linesize, 16,
1762 s->sprite_delta[0][0], s->sprite_delta[0][1],
1763 s->sprite_delta[1][0], s->sprite_delta[1][1],
1764 a+1, (1<<(2*a+1)) - s->no_rounding,
1765 s->h_edge_pos, s->v_edge_pos);
1766 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
1767 ox + s->sprite_delta[0][0]*8,
1768 oy + s->sprite_delta[1][0]*8,
1769 s->sprite_delta[0][0], s->sprite_delta[0][1],
1770 s->sprite_delta[1][0], s->sprite_delta[1][1],
1771 a+1, (1<<(2*a+1)) - s->no_rounding,
1772 s->h_edge_pos, s->v_edge_pos);
1774 if(s->flags&CODEC_FLAG_GRAY) return;
1777 dest_cb+=dest_offset>>1;
1778 dest_cr+=dest_offset>>1;
1780 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
1781 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
1783 ptr = ref_picture[1] + (src_offset>>1);
1784 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
1787 s->sprite_delta[0][0], s->sprite_delta[0][1],
1788 s->sprite_delta[1][0], s->sprite_delta[1][1],
1789 a+1, (1<<(2*a+1)) - s->no_rounding,
1790 s->h_edge_pos>>1, s->v_edge_pos>>1);
1792 ptr = ref_picture[2] + (src_offset>>1);
1793 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
1796 s->sprite_delta[0][0], s->sprite_delta[0][1],
1797 s->sprite_delta[1][0], s->sprite_delta[1][1],
1798 a+1, (1<<(2*a+1)) - s->no_rounding,
1799 s->h_edge_pos>>1, s->v_edge_pos>>1);
1803 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
1804 * @param buf destination buffer
1805 * @param src source buffer
1806 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
1807 * @param block_w width of block
1808 * @param block_h height of block
1809 * @param src_x x coordinate of the top left sample of the block in the source buffer
1810 * @param src_y y coordinate of the top left sample of the block in the source buffer
1811 * @param w width of the source buffer
1812 * @param h height of the source buffer
1814 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
1815 int src_x, int src_y, int w, int h){
1817 int start_y, start_x, end_y, end_x;
1820 src+= (h-1-src_y)*linesize;
1822 }else if(src_y<=-block_h){
1823 src+= (1-block_h-src_y)*linesize;
1829 }else if(src_x<=-block_w){
1830 src+= (1-block_w-src_x);
1834 start_y= FFMAX(0, -src_y);
1835 start_x= FFMAX(0, -src_x);
1836 end_y= FFMIN(block_h, h-src_y);
1837 end_x= FFMIN(block_w, w-src_x);
1839 // copy existing part
1840 for(y=start_y; y<end_y; y++){
1841 for(x=start_x; x<end_x; x++){
1842 buf[x + y*linesize]= src[x + y*linesize];
1847 for(y=0; y<start_y; y++){
1848 for(x=start_x; x<end_x; x++){
1849 buf[x + y*linesize]= buf[x + start_y*linesize];
1854 for(y=end_y; y<block_h; y++){
1855 for(x=start_x; x<end_x; x++){
1856 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
1860 for(y=0; y<block_h; y++){
1862 for(x=0; x<start_x; x++){
1863 buf[x + y*linesize]= buf[start_x + y*linesize];
1867 for(x=end_x; x<block_w; x++){
1868 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
1874 /* apply one mpeg motion vector to the three components */
1875 static inline void mpeg_motion(MpegEncContext *s,
1876 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1878 uint8_t **ref_picture, int src_offset,
1879 int field_based, op_pixels_func (*pix_op)[4],
1880 int motion_x, int motion_y, int h)
1883 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1886 if(s->quarter_sample)
1892 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1893 src_x = s->mb_x * 16 + (motion_x >> 1);
1894 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);
1896 /* WARNING: do no forget half pels */
1897 height = s->height >> field_based;
1898 v_edge_pos = s->v_edge_pos >> field_based;
1899 src_x = clip(src_x, -16, s->width);
1900 if (src_x == s->width)
1902 src_y = clip(src_y, -16, height);
1903 if (src_y == height)
1905 linesize = s->current_picture.linesize[0] << field_based;
1906 uvlinesize = s->current_picture.linesize[1] << field_based;
1907 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;
1908 dest_y += dest_offset;
1910 if(s->flags&CODEC_FLAG_EMU_EDGE){
1911 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos
1912 || src_y + (motion_y&1) + h > v_edge_pos){
1913 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below
1914 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1915 ptr= s->edge_emu_buffer + src_offset;
1919 pix_op[0][dxy](dest_y, ptr, linesize, h);
1921 if(s->flags&CODEC_FLAG_GRAY) return;
1923 if (s->out_format == FMT_H263) {
1925 if ((motion_x & 3) != 0)
1927 if ((motion_y & 3) != 0)
1934 dxy = ((my & 1) << 1) | (mx & 1);
1939 src_x = s->mb_x * 8 + mx;
1940 src_y = s->mb_y * (8 >> field_based) + my;
1941 src_x = clip(src_x, -8, s->width >> 1);
1942 if (src_x == (s->width >> 1))
1944 src_y = clip(src_y, -8, height >> 1);
1945 if (src_y == (height >> 1))
1947 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1948 ptr = ref_picture[1] + offset;
1950 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1951 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1952 ptr= s->edge_emu_buffer + (src_offset >> 1);
1954 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1956 ptr = ref_picture[2] + offset;
1958 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1959 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1960 ptr= s->edge_emu_buffer + (src_offset >> 1);
1962 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1965 static inline void qpel_motion(MpegEncContext *s,
1966 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1968 uint8_t **ref_picture, int src_offset,
1969 int field_based, op_pixels_func (*pix_op)[4],
1970 qpel_mc_func (*qpix_op)[16],
1971 int motion_x, int motion_y, int h)
1974 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
1977 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
1978 src_x = s->mb_x * 16 + (motion_x >> 2);
1979 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
1981 height = s->height >> field_based;
1982 v_edge_pos = s->v_edge_pos >> field_based;
1983 src_x = clip(src_x, -16, s->width);
1984 if (src_x == s->width)
1986 src_y = clip(src_y, -16, height);
1987 if (src_y == height)
1989 linesize = s->linesize << field_based;
1990 uvlinesize = s->uvlinesize << field_based;
1991 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
1992 dest_y += dest_offset;
1993 //printf("%d %d %d\n", src_x, src_y, dxy);
1995 if(s->flags&CODEC_FLAG_EMU_EDGE){
1996 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos
1997 || src_y + (motion_y&3) + h > v_edge_pos){
1998 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based,
1999 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2000 ptr= s->edge_emu_buffer + src_offset;
2005 qpix_op[0][dxy](dest_y, ptr, linesize);
2007 //damn interlaced mode
2008 //FIXME boundary mirroring is not exactly correct here
2009 qpix_op[1][dxy](dest_y , ptr , linesize);
2010 qpix_op[1][dxy](dest_y+8, ptr+8, linesize);
2013 if(s->flags&CODEC_FLAG_GRAY) return;
2018 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2019 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2020 mx= (motion_x>>1) + rtab[motion_x&7];
2021 my= (motion_y>>1) + rtab[motion_y&7];
2022 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2023 mx= (motion_x>>1)|(motion_x&1);
2024 my= (motion_y>>1)|(motion_y&1);
2032 dxy= (mx&1) | ((my&1)<<1);
2036 src_x = s->mb_x * 8 + mx;
2037 src_y = s->mb_y * (8 >> field_based) + my;
2038 src_x = clip(src_x, -8, s->width >> 1);
2039 if (src_x == (s->width >> 1))
2041 src_y = clip(src_y, -8, height >> 1);
2042 if (src_y == (height >> 1))
2045 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
2046 ptr = ref_picture[1] + offset;
2048 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
2049 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2050 ptr= s->edge_emu_buffer + (src_offset >> 1);
2052 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2054 ptr = ref_picture[2] + offset;
2056 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
2057 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2058 ptr= s->edge_emu_buffer + (src_offset >> 1);
2060 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2063 inline int ff_h263_round_chroma(int x){
2065 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2068 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2073 * motion compesation of a single macroblock
2075 * @param dest_y luma destination pointer
2076 * @param dest_cb chroma cb/u destination pointer
2077 * @param dest_cr chroma cr/v destination pointer
2078 * @param dir direction (0->forward, 1->backward)
2079 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2080 * @param pic_op halfpel motion compensation function (average or put normally)
2081 * @param pic_op qpel motion compensation function (average or put normally)
2082 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2084 static inline void MPV_motion(MpegEncContext *s,
2085 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2086 int dir, uint8_t **ref_picture,
2087 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
2089 int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;
2091 uint8_t *ptr, *dest;
2097 switch(s->mv_type) {
2101 if(s->real_sprite_warping_points==1){
2102 gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,
2105 gmc_motion(s, dest_y, dest_cb, dest_cr, 0,
2108 }else if(s->quarter_sample){
2109 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
2112 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2114 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
2115 ref_picture, pix_op,
2116 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2120 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2123 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2129 if(s->quarter_sample){
2131 motion_x = s->mv[dir][i][0];
2132 motion_y = s->mv[dir][i][1];
2134 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2135 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
2136 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
2138 /* WARNING: do no forget half pels */
2139 src_x = clip(src_x, -16, s->width);
2140 if (src_x == s->width)
2142 src_y = clip(src_y, -16, s->height);
2143 if (src_y == s->height)
2146 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2147 if(s->flags&CODEC_FLAG_EMU_EDGE){
2148 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos
2149 || src_y + (motion_y&3) + 8 > s->v_edge_pos){
2150 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2151 ptr= s->edge_emu_buffer;
2154 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2155 qpix_op[1][dxy](dest, ptr, s->linesize);
2157 mx += s->mv[dir][i][0]/2;
2158 my += s->mv[dir][i][1]/2;
2162 motion_x = s->mv[dir][i][0];
2163 motion_y = s->mv[dir][i][1];
2165 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2166 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
2167 src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;
2169 /* WARNING: do no forget half pels */
2170 src_x = clip(src_x, -16, s->width);
2171 if (src_x == s->width)
2173 src_y = clip(src_y, -16, s->height);
2174 if (src_y == s->height)
2177 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2178 if(s->flags&CODEC_FLAG_EMU_EDGE){
2179 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos
2180 || src_y + (motion_y&1) + 8 > s->v_edge_pos){
2181 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2182 ptr= s->edge_emu_buffer;
2185 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2186 pix_op[1][dxy](dest, ptr, s->linesize, 8);
2188 mx += s->mv[dir][i][0];
2189 my += s->mv[dir][i][1];
2193 if(s->flags&CODEC_FLAG_GRAY) break;
2194 /* In case of 8X8, we construct a single chroma motion vector
2195 with a special rounding */
2196 mx= ff_h263_round_chroma(mx);
2197 my= ff_h263_round_chroma(my);
2198 dxy = ((my & 1) << 1) | (mx & 1);
2202 src_x = mb_x * 8 + mx;
2203 src_y = mb_y * 8 + my;
2204 src_x = clip(src_x, -8, s->width/2);
2205 if (src_x == s->width/2)
2207 src_y = clip(src_y, -8, s->height/2);
2208 if (src_y == s->height/2)
2211 offset = (src_y * (s->uvlinesize)) + src_x;
2212 ptr = ref_picture[1] + offset;
2213 if(s->flags&CODEC_FLAG_EMU_EDGE){
2214 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1
2215 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){
2216 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2217 ptr= s->edge_emu_buffer;
2221 pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8);
2223 ptr = ref_picture[2] + offset;
2225 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2226 ptr= s->edge_emu_buffer;
2228 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);
2231 if (s->picture_structure == PICT_FRAME) {
2232 if(s->quarter_sample){
2234 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
2235 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
2237 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2239 qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2240 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
2242 s->mv[dir][1][0], s->mv[dir][1][1], 8);
2245 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2246 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
2248 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2250 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2251 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
2253 s->mv[dir][1][0], s->mv[dir][1][1], 8);
2257 if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){
2258 offset= s->field_select[dir][0] ? s->linesize : 0;
2260 ref_picture= s->current_picture.data;
2261 offset= s->field_select[dir][0] ? s->linesize : -s->linesize;
2264 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2265 ref_picture, offset,
2267 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2272 uint8_t ** ref2picture;
2274 if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){
2275 ref2picture= ref_picture;
2276 offset= s->field_select[dir][0] ? s->linesize : 0;
2278 ref2picture= s->current_picture.data;
2279 offset= s->field_select[dir][0] ? s->linesize : -s->linesize;
2282 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2283 ref2picture, offset,
2285 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2288 if(s->picture_structure == s->field_select[dir][1] + 1 || s->pict_type == B_TYPE || s->first_field){
2289 ref2picture= ref_picture;
2290 offset= s->field_select[dir][1] ? s->linesize : 0;
2292 ref2picture= s->current_picture.data;
2293 offset= s->field_select[dir][1] ? s->linesize : -s->linesize;
2295 // I know it is ugly but this is the only way to fool emu_edge without rewrite mpeg_motion
2296 mpeg_motion(s, dest_y+16*s->linesize, dest_cb+8*s->uvlinesize, dest_cr+8*s->uvlinesize,
2298 ref2picture, offset,
2300 s->mv[dir][1][0], s->mv[dir][1][1]+16, 8);
2306 op_pixels_func (*dmv_pix_op)[4];
2309 dmv_pix_op = s->dsp.put_pixels_tab;
2311 if(s->picture_structure == PICT_FRAME){
2312 //put top field from top field
2313 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2316 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2317 //put bottom field from bottom field
2318 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2319 ref_picture, s->linesize,
2321 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2323 dmv_pix_op = s->dsp.avg_pixels_tab;
2325 //avg top field from bottom field
2326 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2327 ref_picture, s->linesize,
2329 s->mv[dir][2][0], s->mv[dir][2][1], 8);
2330 //avg bottom field from top field
2331 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2334 s->mv[dir][3][0], s->mv[dir][3][1], 8);
2337 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2340 //put field from the same parity
2341 //same parity is never in the same frame
2342 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2345 s->mv[dir][0][0],s->mv[dir][0][1],16);
2347 // after put we make avg of the same block
2348 dmv_pix_op=s->dsp.avg_pixels_tab;
2350 //opposite parity is always in the same frame if this is second field
2351 if(!s->first_field){
2352 ref_picture = s->current_picture.data;
2353 //top field is one linesize from frame beginig
2354 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2355 -s->linesize : s->linesize;
2357 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2360 //avg field from the opposite parity
2361 mpeg_motion(s, dest_y, dest_cb, dest_cr,0,
2362 ref_picture, offset,
2364 s->mv[dir][2][0],s->mv[dir][2][1],16);
2373 /* put block[] to dest[] */
2374 static inline void put_dct(MpegEncContext *s,
2375 DCTELEM *block, int i, uint8_t *dest, int line_size)
2377 s->dct_unquantize(s, block, i, s->qscale);
2378 s->dsp.idct_put (dest, line_size, block);
2381 /* add block[] to dest[] */
2382 static inline void add_dct(MpegEncContext *s,
2383 DCTELEM *block, int i, uint8_t *dest, int line_size)
2385 if (s->block_last_index[i] >= 0) {
2386 s->dsp.idct_add (dest, line_size, block);
2390 static inline void add_dequant_dct(MpegEncContext *s,
2391 DCTELEM *block, int i, uint8_t *dest, int line_size)
2393 if (s->block_last_index[i] >= 0) {
2394 s->dct_unquantize(s, block, i, s->qscale);
2396 s->dsp.idct_add (dest, line_size, block);
2401 * cleans dc, ac, coded_block for the current non intra MB
2403 void ff_clean_intra_table_entries(MpegEncContext *s)
2405 int wrap = s->block_wrap[0];
2406 int xy = s->block_index[0];
2409 s->dc_val[0][xy + 1 ] =
2410 s->dc_val[0][xy + wrap] =
2411 s->dc_val[0][xy + 1 + wrap] = 1024;
2413 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2414 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2415 if (s->msmpeg4_version>=3) {
2416 s->coded_block[xy ] =
2417 s->coded_block[xy + 1 ] =
2418 s->coded_block[xy + wrap] =
2419 s->coded_block[xy + 1 + wrap] = 0;
2422 wrap = s->block_wrap[4];
2423 xy = s->mb_x + 1 + (s->mb_y + 1) * wrap;
2425 s->dc_val[2][xy] = 1024;
2427 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2428 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2430 s->mbintra_table[s->mb_x + s->mb_y*s->mb_stride]= 0;
2433 /* generic function called after a macroblock has been parsed by the
2434 decoder or after it has been encoded by the encoder.
2436 Important variables used:
2437 s->mb_intra : true if intra macroblock
2438 s->mv_dir : motion vector direction
2439 s->mv_type : motion vector type
2440 s->mv : motion vector
2441 s->interlaced_dct : true if interlaced dct used (mpeg2)
2443 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
2446 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2448 if(s->avctx->xvmc_acceleration){
2449 XVMC_decode_mb(s,block);
2457 s->current_picture.qscale_table[mb_xy]= s->qscale;
2459 /* update DC predictors for P macroblocks */
2461 if (s->h263_pred || s->h263_aic) {
2462 if(s->mbintra_table[mb_xy])
2463 ff_clean_intra_table_entries(s);
2467 s->last_dc[2] = 128 << s->intra_dc_precision;
2470 else if (s->h263_pred || s->h263_aic)
2471 s->mbintra_table[mb_xy]=1;
2473 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
2474 uint8_t *dest_y, *dest_cb, *dest_cr;
2475 int dct_linesize, dct_offset;
2476 op_pixels_func (*op_pix)[4];
2477 qpel_mc_func (*op_qpix)[16];
2478 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
2479 const int uvlinesize= s->current_picture.linesize[1];
2481 /* avoid copy if macroblock skipped in last frame too */
2482 /* skip only during decoding as we might trash the buffers during encoding a bit */
2484 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2485 const int age= s->current_picture.age;
2491 assert(s->pict_type!=I_TYPE);
2493 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
2494 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2496 /* if previous was skipped too, then nothing to do ! */
2497 if (*mbskip_ptr >= age && s->current_picture.reference){
2500 } else if(!s->current_picture.reference){
2501 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2502 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2504 *mbskip_ptr = 0; /* not skipped */
2508 if (s->interlaced_dct) {
2509 dct_linesize = linesize * 2;
2510 dct_offset = linesize;
2512 dct_linesize = linesize;
2513 dct_offset = linesize * 8;
2517 dest_cb= s->dest[1];
2518 dest_cr= s->dest[2];
2521 /* motion handling */
2522 /* decoding or more than one mb_type (MC was allready done otherwise) */
2524 if ((!s->no_rounding) || s->pict_type==B_TYPE){
2525 op_pix = s->dsp.put_pixels_tab;
2526 op_qpix= s->dsp.put_qpel_pixels_tab;
2528 op_pix = s->dsp.put_no_rnd_pixels_tab;
2529 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
2532 if (s->mv_dir & MV_DIR_FORWARD) {
2533 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2534 op_pix = s->dsp.avg_pixels_tab;
2535 op_qpix= s->dsp.avg_qpel_pixels_tab;
2537 if (s->mv_dir & MV_DIR_BACKWARD) {
2538 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2542 /* skip dequant / idct if we are really late ;) */
2543 if(s->hurry_up>1) return;
2545 /* add dct residue */
2546 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2547 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2548 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize);
2549 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2550 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2551 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2553 if(!(s->flags&CODEC_FLAG_GRAY)){
2554 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize);
2555 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize);
2557 } else if(s->codec_id != CODEC_ID_WMV2){
2558 add_dct(s, block[0], 0, dest_y, dct_linesize);
2559 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2560 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2561 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2563 if(!(s->flags&CODEC_FLAG_GRAY)){
2564 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2565 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2570 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2574 /* dct only in intra block */
2575 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2576 put_dct(s, block[0], 0, dest_y, dct_linesize);
2577 put_dct(s, block[1], 1, dest_y + 8, dct_linesize);
2578 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
2579 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
2581 if(!(s->flags&CODEC_FLAG_GRAY)){
2582 put_dct(s, block[4], 4, dest_cb, uvlinesize);
2583 put_dct(s, block[5], 5, dest_cr, uvlinesize);
2586 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2587 s->dsp.idct_put(dest_y + 8, dct_linesize, block[1]);
2588 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2589 s->dsp.idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]);
2591 if(!(s->flags&CODEC_FLAG_GRAY)){
2592 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2593 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2600 #ifdef CONFIG_ENCODERS
2602 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
2604 static const char tab[64]=
2616 DCTELEM *block= s->block[n];
2617 const int last_index= s->block_last_index[n];
2622 threshold= -threshold;
2626 /* are all which we could set to zero are allready zero? */
2627 if(last_index<=skip_dc - 1) return;
2629 for(i=0; i<=last_index; i++){
2630 const int j = s->intra_scantable.permutated[i];
2631 const int level = ABS(block[j]);
2633 if(skip_dc && i==0) continue;
2642 if(score >= threshold) return;
2643 for(i=skip_dc; i<=last_index; i++){
2644 const int j = s->intra_scantable.permutated[i];
2647 if(block[0]) s->block_last_index[n]= 0;
2648 else s->block_last_index[n]= -1;
2651 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
2654 const int maxlevel= s->max_qcoeff;
2655 const int minlevel= s->min_qcoeff;
2658 i=1; //skip clipping of intra dc
2662 for(;i<=last_index; i++){
2663 const int j= s->intra_scantable.permutated[i];
2664 int level = block[j];
2666 if (level>maxlevel) level=maxlevel;
2667 else if(level<minlevel) level=minlevel;
2674 static int pix_vcmp16x8(uint8_t *s, int stride){ //FIXME move to dsputil & optimize
2679 for(x=0; x<16; x+=4){
2680 score+= ABS(s[x ] - s[x +stride]) + ABS(s[x+1] - s[x+1+stride])
2681 +ABS(s[x+2] - s[x+2+stride]) + ABS(s[x+3] - s[x+3+stride]);
2689 static int pix_diff_vcmp16x8(uint8_t *s1, uint8_t*s2, int stride){ //FIXME move to dsputil & optimize
2694 for(x=0; x<16; x++){
2695 score+= ABS(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
2704 #define SQ(a) ((a)*(a))
2706 static int pix_vcmp16x8(uint8_t *s, int stride){ //FIXME move to dsputil & optimize
2711 for(x=0; x<16; x+=4){
2712 score+= SQ(s[x ] - s[x +stride]) + SQ(s[x+1] - s[x+1+stride])
2713 +SQ(s[x+2] - s[x+2+stride]) + SQ(s[x+3] - s[x+3+stride]);
2721 static int pix_diff_vcmp16x8(uint8_t *s1, uint8_t*s2, int stride){ //FIXME move to dsputil & optimize
2726 for(x=0; x<16; x++){
2727 score+= SQ(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
2738 #endif //CONFIG_ENCODERS
2742 * @param h is the normal height, this will be reduced automatically if needed for the last row
2744 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2745 if (s->avctx->draw_horiz_band) {
2749 if(s->picture_structure != PICT_FRAME){
2752 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2755 h= FFMIN(h, s->height - y);
2757 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2758 src= (AVFrame*)s->current_picture_ptr;
2759 else if(s->last_picture_ptr)
2760 src= (AVFrame*)s->last_picture_ptr;
2764 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2770 offset[0]= y * s->linesize;;
2772 offset[2]= (y>>1) * s->uvlinesize;;
2778 s->avctx->draw_horiz_band(s->avctx, src, offset,
2779 y, s->picture_structure, h);
2783 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2784 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
2785 const int uvlinesize= s->current_picture.linesize[1];
2787 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2788 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
2789 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
2790 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
2791 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2792 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2794 if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME){
2795 s->dest[0] = s->current_picture.data[0] + s->mb_x * 16 - 16;
2796 s->dest[1] = s->current_picture.data[1] + s->mb_x * 8 - 8;
2797 s->dest[2] = s->current_picture.data[2] + s->mb_x * 8 - 8;
2799 s->dest[0] = s->current_picture.data[0] + (s->mb_y * 16* linesize ) + s->mb_x * 16 - 16;
2800 s->dest[1] = s->current_picture.data[1] + (s->mb_y * 8 * uvlinesize) + s->mb_x * 8 - 8;
2801 s->dest[2] = s->current_picture.data[2] + (s->mb_y * 8 * uvlinesize) + s->mb_x * 8 - 8;
2805 #ifdef CONFIG_ENCODERS
2807 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
2809 const int mb_x= s->mb_x;
2810 const int mb_y= s->mb_y;
2813 int dct_offset = s->linesize*8; //default for progressive frames
2815 for(i=0; i<6; i++) skip_dct[i]=0;
2817 if(s->adaptive_quant){
2818 s->dquant= s->current_picture.qscale_table[mb_x + mb_y*s->mb_stride] - s->qscale;
2820 if(s->out_format==FMT_H263){
2821 if (s->dquant> 2) s->dquant= 2;
2822 else if(s->dquant<-2) s->dquant=-2;
2825 if(s->codec_id==CODEC_ID_MPEG4){
2827 if(s->mv_dir&MV_DIRECT)
2830 assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8);
2833 s->qscale+= s->dquant;
2834 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2835 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2843 wrap_y = s->linesize;
2844 ptr = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2846 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2847 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2848 ptr= s->edge_emu_buffer;
2852 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2853 int progressive_score, interlaced_score;
2855 progressive_score= pix_vcmp16x8(ptr, wrap_y ) + pix_vcmp16x8(ptr + wrap_y*8, wrap_y );
2856 interlaced_score = pix_vcmp16x8(ptr, wrap_y*2) + pix_vcmp16x8(ptr + wrap_y , wrap_y*2);
2858 if(progressive_score > interlaced_score + 100){
2859 s->interlaced_dct=1;
2864 s->interlaced_dct=0;
2867 s->dsp.get_pixels(s->block[0], ptr , wrap_y);
2868 s->dsp.get_pixels(s->block[1], ptr + 8, wrap_y);
2869 s->dsp.get_pixels(s->block[2], ptr + dct_offset , wrap_y);
2870 s->dsp.get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y);
2872 if(s->flags&CODEC_FLAG_GRAY){
2876 int wrap_c = s->uvlinesize;
2877 ptr = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2879 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2880 ptr= s->edge_emu_buffer;
2882 s->dsp.get_pixels(s->block[4], ptr, wrap_c);
2884 ptr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2886 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2887 ptr= s->edge_emu_buffer;
2889 s->dsp.get_pixels(s->block[5], ptr, wrap_c);
2892 op_pixels_func (*op_pix)[4];
2893 qpel_mc_func (*op_qpix)[16];
2894 uint8_t *dest_y, *dest_cb, *dest_cr;
2895 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2899 dest_y = s->dest[0];
2900 dest_cb = s->dest[1];
2901 dest_cr = s->dest[2];
2902 wrap_y = s->linesize;
2903 wrap_c = s->uvlinesize;
2904 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
2905 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
2906 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
2908 if ((!s->no_rounding) || s->pict_type==B_TYPE){
2909 op_pix = s->dsp.put_pixels_tab;
2910 op_qpix= s->dsp.put_qpel_pixels_tab;
2912 op_pix = s->dsp.put_no_rnd_pixels_tab;
2913 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
2916 if (s->mv_dir & MV_DIR_FORWARD) {
2917 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2918 op_pix = s->dsp.avg_pixels_tab;
2919 op_qpix= s->dsp.avg_qpel_pixels_tab;
2921 if (s->mv_dir & MV_DIR_BACKWARD) {
2922 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2925 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
2926 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
2927 ptr_y= s->edge_emu_buffer;
2931 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
2932 int progressive_score, interlaced_score;
2934 progressive_score= pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y )
2935 + pix_diff_vcmp16x8(ptr_y + wrap_y*8, dest_y + wrap_y*8, wrap_y );
2936 interlaced_score = pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y*2)
2937 + pix_diff_vcmp16x8(ptr_y + wrap_y , dest_y + wrap_y , wrap_y*2);
2939 if(progressive_score > interlaced_score + 600){
2940 s->interlaced_dct=1;
2945 s->interlaced_dct=0;
2948 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
2949 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2950 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
2951 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
2953 if(s->flags&CODEC_FLAG_GRAY){
2958 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2959 ptr_cb= s->edge_emu_buffer;
2961 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
2963 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
2964 ptr_cr= s->edge_emu_buffer;
2966 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
2968 /* pre quantization */
2969 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
2971 if(s->dsp.pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1;
2972 if(s->dsp.pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1;
2973 if(s->dsp.pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1;
2974 if(s->dsp.pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1;
2975 if(s->dsp.pix_abs8x8(ptr_cb , dest_cb , wrap_c) < 20*s->qscale) skip_dct[4]= 1;
2976 if(s->dsp.pix_abs8x8(ptr_cr , dest_cr , wrap_c) < 20*s->qscale) skip_dct[5]= 1;
2982 if(skip_dct[i]) num++;
2985 if(s->mb_x==0 && s->mb_y==0){
2987 printf("%6d %1d\n", stat[i], i);
3000 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_stride*mb_y+mb_x] + 1.0) /
3001 ((s->mb_var[s->mb_stride*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
3003 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
3004 (s->mb_type[s->mb_stride*mb_y+mb_x] > 0) ? 'I' : 'P',
3005 s->qscale, adap_parm, s->qscale*adap_parm,
3006 s->mb_var[s->mb_stride*mb_y+mb_x], s->avg_mb_var);
3009 /* DCT & quantize */
3010 if(s->out_format==FMT_MJPEG){
3013 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, 8, &overflow);
3014 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3020 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
3021 // FIXME we could decide to change to quantizer instead of clipping
3022 // JS: I don't think that would be a good idea it could lower quality instead
3023 // of improve it. Just INTRADC clipping deserves changes in quantizer
3024 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3026 s->block_last_index[i]= -1;
3028 if(s->flags & CODEC_FLAG_CBP_RD){
3030 if(s->block_last_index[i] == -1)
3031 s->coded_score[i]= INT_MAX/256;
3035 if(s->luma_elim_threshold && !s->mb_intra)
3037 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
3038 if(s->chroma_elim_threshold && !s->mb_intra)
3040 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
3043 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3044 s->block_last_index[4]=
3045 s->block_last_index[5]= 0;
3047 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
3050 /* huffman encode */
3051 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
3052 case CODEC_ID_MPEG1VIDEO:
3053 case CODEC_ID_MPEG2VIDEO:
3054 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
3056 case CODEC_ID_MPEG4:
3057 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3058 case CODEC_ID_MSMPEG4V2:
3059 case CODEC_ID_MSMPEG4V3:
3061 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3063 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
3065 case CODEC_ID_H263P:
3068 h263_encode_mb(s, s->block, motion_x, motion_y); break;
3070 case CODEC_ID_MJPEG:
3071 mjpeg_encode_mb(s, s->block); break;
3077 #endif //CONFIG_ENCODERS
3080 * combines the (truncated) bitstream to a complete frame
3081 * @returns -1 if no complete frame could be created
3083 int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size){
3084 ParseContext *pc= &s->parse_context;
3088 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
3089 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
3093 /* copy overreaded byes from last frame into buffer */
3094 for(; pc->overread>0; pc->overread--){
3095 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
3098 pc->last_index= pc->index;
3100 /* copy into buffer end return */
3101 if(next == END_NOT_FOUND){
3102 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
3104 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
3105 pc->index += *buf_size;
3110 pc->overread_index= pc->index + next;
3112 /* append to buffer */
3114 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
3116 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
3121 /* store overread bytes */
3122 for(;next < 0; next++){
3123 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
3129 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
3130 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
3137 void ff_mpeg_flush(AVCodecContext *avctx){
3139 MpegEncContext *s = avctx->priv_data;
3141 for(i=0; i<MAX_PICTURE_COUNT; i++){
3142 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
3143 || s->picture[i].type == FF_BUFFER_TYPE_USER))
3144 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
3146 s->last_picture_ptr = s->next_picture_ptr = NULL;
3148 s->parse_context.state= -1;
3149 s->parse_context.frame_start_found= 0;
3150 s->parse_context.overread= 0;
3151 s->parse_context.overread_index= 0;
3152 s->parse_context.index= 0;
3153 s->parse_context.last_index= 0;
3156 #ifdef CONFIG_ENCODERS
3157 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
3159 int bytes= length>>4;
3160 int bits= length&15;
3163 if(length==0) return;
3165 for(i=0; i<bytes; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i]));
3166 put_bits(pb, bits, be2me_16(((uint16_t*)src)[i])>>(16-bits));
3169 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
3172 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3175 d->mb_skip_run= s->mb_skip_run;
3177 d->last_dc[i]= s->last_dc[i];
3180 d->mv_bits= s->mv_bits;
3181 d->i_tex_bits= s->i_tex_bits;
3182 d->p_tex_bits= s->p_tex_bits;
3183 d->i_count= s->i_count;
3184 d->f_count= s->f_count;
3185 d->b_count= s->b_count;
3186 d->skip_count= s->skip_count;
3187 d->misc_bits= s->misc_bits;
3191 d->qscale= s->qscale;
3194 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
3197 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
3198 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3201 d->mb_skip_run= s->mb_skip_run;
3203 d->last_dc[i]= s->last_dc[i];
3206 d->mv_bits= s->mv_bits;
3207 d->i_tex_bits= s->i_tex_bits;
3208 d->p_tex_bits= s->p_tex_bits;
3209 d->i_count= s->i_count;
3210 d->f_count= s->f_count;
3211 d->b_count= s->b_count;
3212 d->skip_count= s->skip_count;
3213 d->misc_bits= s->misc_bits;
3215 d->mb_intra= s->mb_intra;
3216 d->mb_skiped= s->mb_skiped;
3217 d->mv_type= s->mv_type;
3218 d->mv_dir= s->mv_dir;
3220 if(s->data_partitioning){
3222 d->tex_pb= s->tex_pb;
3226 d->block_last_index[i]= s->block_last_index[i];
3227 d->interlaced_dct= s->interlaced_dct;
3228 d->qscale= s->qscale;
3231 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
3232 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
3233 int *dmin, int *next_block, int motion_x, int motion_y)
3236 uint8_t *dest_backup[3];
3238 copy_context_before_encode(s, backup, type);
3240 s->block= s->blocks[*next_block];
3241 s->pb= pb[*next_block];
3242 if(s->data_partitioning){
3243 s->pb2 = pb2 [*next_block];
3244 s->tex_pb= tex_pb[*next_block];
3248 memcpy(dest_backup, s->dest, sizeof(s->dest));
3249 s->dest[0] = s->me.scratchpad;
3250 s->dest[1] = s->me.scratchpad + 16;
3251 s->dest[2] = s->me.scratchpad + 16 + 8;
3252 assert(2*s->uvlinesize == s->linesize); //should be no prob for encoding
3253 assert(s->linesize >= 64); //FIXME
3256 encode_mb(s, motion_x, motion_y);
3258 score= get_bit_count(&s->pb);
3259 if(s->data_partitioning){
3260 score+= get_bit_count(&s->pb2);
3261 score+= get_bit_count(&s->tex_pb);
3264 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
3265 MPV_decode_mb(s, s->block);
3267 score *= s->qscale * s->qscale * 109;
3268 score += sse_mb(s) << 7;
3272 memcpy(s->dest, dest_backup, sizeof(s->dest));
3279 copy_context_after_encode(best, s, type);
3283 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
3284 uint32_t *sq = squareTbl + 256;
3289 return s->dsp.sse[0](NULL, src1, src2, stride);
3290 else if(w==8 && h==8)
3291 return s->dsp.sse[1](NULL, src1, src2, stride);
3295 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
3304 static int sse_mb(MpegEncContext *s){
3308 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3309 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3312 return s->dsp.sse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize)
3313 +s->dsp.sse[1](NULL, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize)
3314 +s->dsp.sse[1](NULL, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize);
3316 return sse(s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize)
3317 +sse(s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize)
3318 +sse(s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize);
3321 static void encode_picture(MpegEncContext *s, int picture_number)
3323 int mb_x, mb_y, pdif = 0;
3326 MpegEncContext best_s, backup_s;
3327 uint8_t bit_buf[2][3000];
3328 uint8_t bit_buf2[2][3000];
3329 uint8_t bit_buf_tex[2][3000];
3330 PutBitContext pb[2], pb2[2], tex_pb[2];
3333 init_put_bits(&pb [i], bit_buf [i], 3000, NULL, NULL);
3334 init_put_bits(&pb2 [i], bit_buf2 [i], 3000, NULL, NULL);
3335 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000, NULL, NULL);
3338 s->picture_number = picture_number;
3340 /* Reset the average MB variance */
3341 s->current_picture.mb_var_sum = 0;
3342 s->current_picture.mc_mb_var_sum = 0;
3345 /* we need to initialize some time vars before we can encode b-frames */
3346 // RAL: Condition added for MPEG1VIDEO
3347 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
3348 ff_set_mpeg4_time(s, s->picture_number);
3351 s->scene_change_score=0;
3353 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration
3355 if(s->pict_type==I_TYPE){
3356 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3357 else s->no_rounding=0;
3358 }else if(s->pict_type!=B_TYPE){
3359 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
3360 s->no_rounding ^= 1;
3363 /* Estimate motion for every MB */
3364 s->mb_intra=0; //for the rate distoration & bit compare functions
3365 if(s->pict_type != I_TYPE){
3366 if(s->pict_type != B_TYPE){
3367 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
3369 s->me.dia_size= s->avctx->pre_dia_size;
3371 for(mb_y=s->mb_height-1; mb_y >=0 ; mb_y--) {
3372 for(mb_x=s->mb_width-1; mb_x >=0 ; mb_x--) {
3375 ff_pre_estimate_p_frame_motion(s, mb_x, mb_y);
3382 s->me.dia_size= s->avctx->dia_size;
3383 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3384 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
3385 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
3386 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
3387 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
3388 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3391 s->block_index[0]+=2;
3392 s->block_index[1]+=2;
3393 s->block_index[2]+=2;
3394 s->block_index[3]+=2;
3396 /* compute motion vector & mb_type and store in context */
3397 if(s->pict_type==B_TYPE)
3398 ff_estimate_b_frame_motion(s, mb_x, mb_y);
3400 ff_estimate_p_frame_motion(s, mb_x, mb_y);
3403 }else /* if(s->pict_type == I_TYPE) */{
3405 //FIXME do we need to zero them?
3406 memset(s->motion_val[0], 0, sizeof(int16_t)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
3407 memset(s->p_mv_table , 0, sizeof(int16_t)*(s->mb_stride)*s->mb_height*2);
3408 memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_stride*s->mb_height);
3410 if(!s->fixed_qscale){
3411 /* finding spatial complexity for I-frame rate control */
3412 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3413 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3416 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
3418 int sum = s->dsp.pix_sum(pix, s->linesize);
3420 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
3422 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
3423 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
3424 s->current_picture.mb_var_sum += varc;
3431 if(s->scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
3432 s->pict_type= I_TYPE;
3433 memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_stride*s->mb_height);
3434 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
3438 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
3439 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER);
3441 ff_fix_long_p_mvs(s);
3444 if(s->pict_type==B_TYPE){
3447 a = ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD);
3448 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, MB_TYPE_BIDIR);
3449 s->f_code = FFMAX(a, b);
3451 a = ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD);
3452 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, MB_TYPE_BIDIR);
3453 s->b_code = FFMAX(a, b);
3455 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD);
3456 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD);
3457 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR);
3458 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR);
3462 if (s->fixed_qscale)
3463 s->frame_qscale = s->current_picture.quality;
3465 s->frame_qscale = ff_rate_estimate_qscale(s);
3467 if(s->adaptive_quant){
3469 switch(s->codec_id){
3470 case CODEC_ID_MPEG4:
3471 ff_clean_mpeg4_qscales(s);
3474 case CODEC_ID_H263P:
3476 ff_clean_h263_qscales(s);
3481 s->qscale= s->current_picture.qscale_table[0];
3483 s->qscale= (int)(s->frame_qscale + 0.5);
3485 if (s->out_format == FMT_MJPEG) {
3486 /* for mjpeg, we do include qscale in the matrix */
3487 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
3489 int j= s->dsp.idct_permutation[i];
3491 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
3493 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
3494 s->q_intra_matrix16_bias, s->intra_matrix, s->intra_quant_bias, 8, 8);
3497 //FIXME var duplication
3498 s->current_picture.key_frame= s->pict_type == I_TYPE;
3499 s->current_picture.pict_type= s->pict_type;
3501 if(s->current_picture.key_frame)
3502 s->picture_in_gop_number=0;
3504 s->last_bits= get_bit_count(&s->pb);
3505 switch(s->out_format) {
3507 mjpeg_picture_header(s);
3511 if (s->codec_id == CODEC_ID_WMV2)
3512 ff_wmv2_encode_picture_header(s, picture_number);
3513 else if (s->h263_msmpeg4)
3514 msmpeg4_encode_picture_header(s, picture_number);
3515 else if (s->h263_pred)
3516 mpeg4_encode_picture_header(s, picture_number);
3517 else if (s->h263_rv10)
3518 rv10_encode_picture_header(s, picture_number);
3519 else if (s->codec_id == CODEC_ID_FLV1)
3520 ff_flv_encode_picture_header(s, picture_number);
3522 h263_encode_picture_header(s, picture_number);
3526 mpeg1_encode_picture_header(s, picture_number);
3531 bits= get_bit_count(&s->pb);
3532 s->header_bits= bits - s->last_bits;
3544 /* init last dc values */
3545 /* note: quant matrix value (8) is implied here */
3546 s->last_dc[i] = 128;
3548 s->current_picture_ptr->error[i] = 0;
3551 s->last_mv[0][0][0] = 0;
3552 s->last_mv[0][0][1] = 0;
3553 s->last_mv[1][0][0] = 0;
3554 s->last_mv[1][0][1] = 0;
3559 switch(s->codec_id){
3561 case CODEC_ID_H263P:
3563 s->gob_index = ff_h263_get_gob_height(s);
3565 case CODEC_ID_MPEG4:
3566 if(s->partitioned_frame)
3567 ff_mpeg4_init_partitions(s);
3574 s->first_slice_line = 1;
3575 s->ptr_lastgob = s->pb.buf;
3576 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
3580 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3581 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
3582 ff_init_block_index(s);
3584 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3585 const int xy= mb_y*s->mb_stride + mb_x;
3586 int mb_type= s->mb_type[xy];
3591 ff_update_block_index(s);
3593 /* write gob / video packet header */
3595 if(s->rtp_mode && mb_y + mb_x>0){
3596 int current_packet_size, is_gob_start;
3598 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
3601 if(s->codec_id==CODEC_ID_MPEG4){
3602 if(current_packet_size >= s->rtp_payload_size){
3604 if(s->partitioned_frame){
3605 ff_mpeg4_merge_partitions(s);
3606 ff_mpeg4_init_partitions(s);
3608 ff_mpeg4_encode_video_packet_header(s);
3610 if(s->flags&CODEC_FLAG_PASS1){
3611 int bits= get_bit_count(&s->pb);
3612 s->misc_bits+= bits - s->last_bits;
3615 ff_mpeg4_clean_buffers(s);
3618 }else if(s->codec_id==CODEC_ID_MPEG1VIDEO){
3619 if( current_packet_size >= s->rtp_payload_size
3620 && s->mb_skip_run==0){
3621 ff_mpeg1_encode_slice_header(s);
3622 ff_mpeg1_clean_buffers(s);
3625 }else if(s->codec_id==CODEC_ID_MPEG2VIDEO){
3626 if( ( current_packet_size >= s->rtp_payload_size || mb_x==0)
3627 && s->mb_skip_run==0){
3628 ff_mpeg1_encode_slice_header(s);
3629 ff_mpeg1_clean_buffers(s);
3633 if(current_packet_size >= s->rtp_payload_size
3634 && s->mb_x==0 && s->mb_y%s->gob_index==0){
3636 h263_encode_gob_header(s, mb_y);
3642 s->ptr_lastgob = pbBufPtr(&s->pb);
3643 s->first_slice_line=1;
3644 s->resync_mb_x=mb_x;
3645 s->resync_mb_y=mb_y;
3650 if( (s->resync_mb_x == s->mb_x)
3651 && s->resync_mb_y+1 == s->mb_y){
3652 s->first_slice_line=0;
3657 if(mb_type & (mb_type-1)){ // more than 1 MB type possible
3659 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3661 copy_context_before_encode(&backup_s, s, -1);
3663 best_s.data_partitioning= s->data_partitioning;
3664 best_s.partitioned_frame= s->partitioned_frame;
3665 if(s->data_partitioning){
3666 backup_s.pb2= s->pb2;
3667 backup_s.tex_pb= s->tex_pb;
3670 if(mb_type&MB_TYPE_INTER){
3671 s->mv_dir = MV_DIR_FORWARD;
3672 s->mv_type = MV_TYPE_16X16;
3674 s->mv[0][0][0] = s->p_mv_table[xy][0];
3675 s->mv[0][0][1] = s->p_mv_table[xy][1];
3676 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER, pb, pb2, tex_pb,
3677 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3679 if(mb_type&MB_TYPE_INTER4V){
3680 s->mv_dir = MV_DIR_FORWARD;
3681 s->mv_type = MV_TYPE_8X8;
3684 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
3685 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
3687 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER4V, pb, pb2, tex_pb,
3688 &dmin, &next_block, 0, 0);
3690 if(mb_type&MB_TYPE_FORWARD){
3691 s->mv_dir = MV_DIR_FORWARD;
3692 s->mv_type = MV_TYPE_16X16;
3694 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3695 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3696 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_FORWARD, pb, pb2, tex_pb,
3697 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
3699 if(mb_type&MB_TYPE_BACKWARD){
3700 s->mv_dir = MV_DIR_BACKWARD;
3701 s->mv_type = MV_TYPE_16X16;
3703 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3704 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3705 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BACKWARD, pb, pb2, tex_pb,
3706 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
3708 if(mb_type&MB_TYPE_BIDIR){
3709 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3710 s->mv_type = MV_TYPE_16X16;
3712 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3713 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3714 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3715 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3716 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb,
3717 &dmin, &next_block, 0, 0);
3719 if(mb_type&MB_TYPE_DIRECT){
3720 int mx= s->b_direct_mv_table[xy][0];
3721 int my= s->b_direct_mv_table[xy][1];
3723 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3726 ff_mpeg4_set_direct_mv(s, mx, my);
3728 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb,
3729 &dmin, &next_block, mx, my);
3731 if(mb_type&MB_TYPE_INTRA){
3733 s->mv_type = MV_TYPE_16X16;
3737 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTRA, pb, pb2, tex_pb,
3738 &dmin, &next_block, 0, 0);
3739 if(s->h263_pred || s->h263_aic){
3741 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
3743 ff_clean_intra_table_entries(s); //old mode?
3746 copy_context_after_encode(s, &best_s, -1);
3748 pb_bits_count= get_bit_count(&s->pb);
3749 flush_put_bits(&s->pb);
3750 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3753 if(s->data_partitioning){
3754 pb2_bits_count= get_bit_count(&s->pb2);
3755 flush_put_bits(&s->pb2);
3756 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3757 s->pb2= backup_s.pb2;
3759 tex_pb_bits_count= get_bit_count(&s->tex_pb);
3760 flush_put_bits(&s->tex_pb);
3761 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3762 s->tex_pb= backup_s.tex_pb;
3764 s->last_bits= get_bit_count(&s->pb);
3767 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
3768 ff_h263_update_motion_val(s);
3772 s->dsp.put_pixels_tab[0][0](s->dest[0], s->me.scratchpad , s->linesize ,16);
3773 s->dsp.put_pixels_tab[1][0](s->dest[1], s->me.scratchpad + 16, s->uvlinesize, 8);
3774 s->dsp.put_pixels_tab[1][0](s->dest[2], s->me.scratchpad + 24, s->uvlinesize, 8);
3777 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
3778 MPV_decode_mb(s, s->block);
3780 int motion_x, motion_y;
3782 int inter_score= s->current_picture.mb_cmp_score[mb_x + mb_y*s->mb_stride];
3784 if(s->avctx->mb_decision==FF_MB_DECISION_SIMPLE && s->pict_type==P_TYPE){ //FIXME check if the mess is usefull at all
3785 /* get luma score */
3786 if((s->avctx->mb_cmp&0xFF)==FF_CMP_SSE){
3787 intra_score= (s->current_picture.mb_var[mb_x + mb_y*s->mb_stride]<<8) - 500; //FIXME dont scale it down so we dont have to fix it
3791 int mean= s->current_picture.mb_mean[mb_x + mb_y*s->mb_stride]; //FIXME
3794 dest_y = s->new_picture.data[0] + (mb_y * 16 * s->linesize ) + mb_x * 16;
3796 for(i=0; i<16; i++){
3797 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+ 0]) = mean;
3798 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+ 4]) = mean;
3799 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+ 8]) = mean;
3800 *(uint32_t*)(&s->me.scratchpad[i*s->linesize+12]) = mean;
3804 intra_score= s->dsp.mb_cmp[0](s, s->me.scratchpad, dest_y, s->linesize);
3806 /* printf("intra:%7d inter:%7d var:%7d mc_var.%7d\n", intra_score>>8, inter_score>>8,
3807 s->current_picture.mb_var[mb_x + mb_y*s->mb_stride],
3808 s->current_picture.mc_mb_var[mb_x + mb_y*s->mb_stride]);*/
3811 /* get chroma score */
3812 if(s->avctx->mb_cmp&FF_CMP_CHROMA){
3820 if(s->out_format == FMT_H263){
3821 mean= (s->dc_val[i][mb_x + (mb_y+1)*(s->mb_width+2)] + 4)>>3; //FIXME not exact but simple ;)
3823 mean= (s->last_dc[i] + 4)>>3;
3825 dest_c = s->new_picture.data[i] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
3829 *(uint32_t*)(&s->me.scratchpad[i*s->uvlinesize+ 0]) = mean;
3830 *(uint32_t*)(&s->me.scratchpad[i*s->uvlinesize+ 4]) = mean;
3833 intra_score+= s->dsp.mb_cmp[1](s, s->me.scratchpad, dest_c, s->uvlinesize);
3838 switch(s->avctx->mb_cmp&0xFF){
3841 intra_score+= 32*s->qscale;
3844 intra_score+= 24*s->qscale*s->qscale;
3847 intra_score+= 96*s->qscale;
3850 intra_score+= 48*s->qscale;
3857 intra_score+= (s->qscale*s->qscale*109*8 + 64)>>7;
3861 if(intra_score < inter_score)
3862 mb_type= MB_TYPE_INTRA;
3865 s->mv_type=MV_TYPE_16X16;
3866 // only one MB-Type possible
3872 motion_x= s->mv[0][0][0] = 0;
3873 motion_y= s->mv[0][0][1] = 0;
3876 s->mv_dir = MV_DIR_FORWARD;
3878 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
3879 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
3881 case MB_TYPE_INTER4V:
3882 s->mv_dir = MV_DIR_FORWARD;
3883 s->mv_type = MV_TYPE_8X8;
3886 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
3887 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
3889 motion_x= motion_y= 0;
3891 case MB_TYPE_DIRECT:
3892 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3894 motion_x=s->b_direct_mv_table[xy][0];
3895 motion_y=s->b_direct_mv_table[xy][1];
3897 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
3901 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
3905 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
3906 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
3907 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
3908 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
3910 case MB_TYPE_BACKWARD:
3911 s->mv_dir = MV_DIR_BACKWARD;
3913 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
3914 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
3916 case MB_TYPE_FORWARD:
3917 s->mv_dir = MV_DIR_FORWARD;
3919 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
3920 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
3921 // printf(" %d %d ", motion_x, motion_y);
3924 motion_x=motion_y=0; //gcc warning fix
3925 printf("illegal MB type\n");
3928 encode_mb(s, motion_x, motion_y);
3930 // RAL: Update last macrobloc type
3931 s->last_mv_dir = s->mv_dir;
3934 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
3935 ff_h263_update_motion_val(s);
3938 MPV_decode_mb(s, s->block);
3941 /* clean the MV table in IPS frames for direct mode in B frames */
3942 if(s->mb_intra /* && I,P,S_TYPE */){
3943 s->p_mv_table[xy][0]=0;
3944 s->p_mv_table[xy][1]=0;
3947 if(s->flags&CODEC_FLAG_PSNR){
3951 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3952 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3954 s->current_picture_ptr->error[0] += sse(
3955 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
3956 s->dest[0], w, h, s->linesize);
3957 s->current_picture_ptr->error[1] += sse(
3958 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3959 s->dest[1], w>>1, h>>1, s->uvlinesize);
3960 s->current_picture_ptr->error[2] += sse(
3961 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
3962 s->dest[2], w>>1, h>>1, s->uvlinesize);
3964 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, get_bit_count(&s->pb));
3970 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame)
3971 ff_mpeg4_merge_partitions(s);
3973 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
3974 msmpeg4_encode_ext_header(s);
3976 if(s->codec_id==CODEC_ID_MPEG4)
3977 ff_mpeg4_stuffing(&s->pb);
3980 //if (s->gob_number)
3981 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
3983 /* Send the last GOB if RTP */
3985 flush_put_bits(&s->pb);
3986 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
3987 /* Call the RTP callback to send the last GOB */
3988 if (s->rtp_callback)
3989 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
3990 s->ptr_lastgob = pbBufPtr(&s->pb);
3991 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
3995 static int dct_quantize_trellis_c(MpegEncContext *s,
3996 DCTELEM *block, int n,
3997 int qscale, int *overflow){
3999 const uint8_t *scantable= s->intra_scantable.scantable;
4001 unsigned int threshold1, threshold2;
4010 int not_coded_score= 0;
4012 int coeff_count[64];
4013 int lambda, qmul, qadd, start_i, last_non_zero, i, dc;
4014 const int esc_length= s->ac_esc_length;
4016 uint8_t * last_length;
4020 s->dsp.fdct (block);
4023 qadd= ((qscale-1)|1)*8;
4034 /* For AIC we skip quant/dequant of INTRADC */
4039 /* note: block[0] is assumed to be positive */
4040 block[0] = (block[0] + (q >> 1)) / q;
4043 qmat = s->q_intra_matrix[qscale];
4044 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4045 bias= 1<<(QMAT_SHIFT-1);
4046 length = s->intra_ac_vlc_length;
4047 last_length= s->intra_ac_vlc_last_length;
4051 qmat = s->q_inter_matrix[qscale];
4052 length = s->inter_ac_vlc_length;
4053 last_length= s->inter_ac_vlc_last_length;
4056 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4057 threshold2= (threshold1<<1);
4059 for(i=start_i; i<64; i++) {
4060 const int j = scantable[i];
4061 const int k= i-start_i;
4062 int level = block[j];
4063 level = level * qmat[j];
4065 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
4066 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
4067 if(((unsigned)(level+threshold1))>threshold2){
4069 level= (bias + level)>>QMAT_SHIFT;
4071 coeff[1][k]= level-1;
4072 // coeff[2][k]= level-2;
4074 level= (bias - level)>>QMAT_SHIFT;
4075 coeff[0][k]= -level;
4076 coeff[1][k]= -level+1;
4077 // coeff[2][k]= -level+2;
4079 coeff_count[k]= FFMIN(level, 2);
4080 assert(coeff_count[k]);
4084 coeff[0][k]= (level>>31)|1;
4089 *overflow= s->max_qcoeff < max; //overflow might have happend
4091 if(last_non_zero < start_i){
4092 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
4093 return last_non_zero;
4096 lambda= (qscale*qscale*64*105 + 64)>>7; //FIXME finetune
4099 for(i=0; i<=last_non_zero - start_i; i++){
4100 int level_index, run, j;
4101 const int dct_coeff= block[ scantable[i + start_i] ];
4102 const int zero_distoration= dct_coeff*dct_coeff;
4103 int best_score=256*256*256*120;
4105 last_score += zero_distoration;
4106 not_coded_score += zero_distoration;
4107 for(level_index=0; level_index < coeff_count[i]; level_index++){
4109 int level= coeff[level_index][i];
4114 if(s->out_format == FMT_H263){
4116 unquant_coeff= level*qmul + qadd;
4118 unquant_coeff= level*qmul - qadd;
4121 j= s->dsp.idct_permutation[ scantable[i + start_i] ]; //FIXME optimize
4124 unquant_coeff = (int)((-level) * qscale * s->intra_matrix[j]) >> 3;
4125 unquant_coeff = -((unquant_coeff - 1) | 1);
4127 unquant_coeff = (int)( level * qscale * s->intra_matrix[j]) >> 3;
4128 unquant_coeff = (unquant_coeff - 1) | 1;
4132 unquant_coeff = ((((-level) << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
4133 unquant_coeff = -((unquant_coeff - 1) | 1);
4135 unquant_coeff = ((( level << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
4136 unquant_coeff = (unquant_coeff - 1) | 1;
4142 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff);
4144 if((level&(~127)) == 0){
4145 for(run=0; run<=i - left_limit; run++){
4146 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4147 score += score_tab[i-run];
4149 if(score < best_score){
4151 score_tab[i+1]= score;
4153 level_tab[i+1]= level-64;
4157 if(s->out_format == FMT_H263){
4158 for(run=0; run<=i - left_limit; run++){
4159 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4160 score += score_tab[i-run];
4161 if(score < last_score){
4164 last_level= level-64;
4170 distoration += esc_length*lambda;
4171 for(run=0; run<=i - left_limit; run++){
4172 int score= distoration + score_tab[i-run];
4174 if(score < best_score){
4176 score_tab[i+1]= score;
4178 level_tab[i+1]= level-64;
4182 if(s->out_format == FMT_H263){
4183 for(run=0; run<=i - left_limit; run++){
4184 int score= distoration + score_tab[i-run];
4185 if(score < last_score){
4188 last_level= level-64;
4196 for(j=left_limit; j<=i; j++){
4197 score_tab[j] += zero_distoration;
4199 score_limit+= zero_distoration;
4200 if(score_tab[i+1] < score_limit)
4201 score_limit= score_tab[i+1];
4203 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
4204 while(score_tab[ left_limit ] > score_limit + lambda) left_limit++;
4207 //FIXME add some cbp penalty
4209 if(s->out_format != FMT_H263){
4210 last_score= 256*256*256*120;
4211 for(i= left_limit; i<=last_non_zero - start_i + 1; i++){
4212 int score= score_tab[i];
4213 if(i) score += lambda*2; //FIXME exacter?
4215 if(score < last_score){
4218 last_level= level_tab[i];
4219 last_run= run_tab[i];
4224 s->coded_score[n] = last_score - not_coded_score;
4227 last_non_zero= last_i - 1 + start_i;
4228 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
4230 if(last_non_zero < start_i)
4231 return last_non_zero;
4233 if(last_non_zero == 0 && start_i == 0){
4235 int best_score= dc * dc;
4237 for(i=0; i<coeff_count[0]; i++){
4238 int level= coeff[i][0];
4239 int unquant_coeff, score, distoration;
4241 if(s->out_format == FMT_H263){
4243 unquant_coeff= (level*qmul + qadd)>>3;
4245 unquant_coeff= (level*qmul - qadd)>>3;
4249 unquant_coeff = ((((-level) << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
4250 unquant_coeff = -((unquant_coeff - 1) | 1);
4252 unquant_coeff = ((( level << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
4253 unquant_coeff = (unquant_coeff - 1) | 1;
4256 unquant_coeff = (unquant_coeff + 4) >> 3;
4257 unquant_coeff<<= 3 + 3;
4259 distoration= (unquant_coeff - dc) * (unquant_coeff - dc);
4261 if((level&(~127)) == 0)
4262 score= distoration + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
4264 score= distoration + esc_length*lambda;
4266 if(score < best_score){
4268 best_level= level - 64;
4271 block[0]= best_level;
4272 s->coded_score[n] = best_score - dc*dc;
4273 if(best_level == 0) return -1;
4274 else return last_non_zero;
4279 //FIXME use permutated scantable
4280 block[ s->dsp.idct_permutation[ scantable[last_non_zero] ] ]= last_level;
4283 for(;i>0 ; i -= run_tab[i] + 1){
4284 const int j= s->dsp.idct_permutation[ scantable[i - 1 + start_i] ];
4286 block[j]= level_tab[i];
4290 return last_non_zero;
4293 static int dct_quantize_c(MpegEncContext *s,
4294 DCTELEM *block, int n,
4295 int qscale, int *overflow)
4297 int i, j, level, last_non_zero, q;
4299 const uint8_t *scantable= s->intra_scantable.scantable;
4302 unsigned int threshold1, threshold2;
4304 s->dsp.fdct (block);
4314 /* For AIC we skip quant/dequant of INTRADC */
4317 /* note: block[0] is assumed to be positive */
4318 block[0] = (block[0] + (q >> 1)) / q;
4321 qmat = s->q_intra_matrix[qscale];
4322 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4326 qmat = s->q_inter_matrix[qscale];
4327 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
4329 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4330 threshold2= (threshold1<<1);
4335 level = level * qmat[j];
4337 // if( bias+level >= (1<<QMAT_SHIFT)
4338 // || bias-level >= (1<<QMAT_SHIFT)){
4339 if(((unsigned)(level+threshold1))>threshold2){
4341 level= (bias + level)>>QMAT_SHIFT;
4344 level= (bias - level)>>QMAT_SHIFT;
4353 *overflow= s->max_qcoeff < max; //overflow might have happend
4355 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4356 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4357 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4359 return last_non_zero;
4362 #endif //CONFIG_ENCODERS
4364 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
4365 DCTELEM *block, int n, int qscale)
4367 int i, level, nCoeffs;
4368 const uint16_t *quant_matrix;
4370 nCoeffs= s->block_last_index[n];
4374 block[0] = block[0] * s->y_dc_scale;
4376 block[0] = block[0] * s->c_dc_scale;
4377 /* XXX: only mpeg1 */
4378 quant_matrix = s->intra_matrix;
4379 for(i=1;i<=nCoeffs;i++) {
4380 int j= s->intra_scantable.permutated[i];
4385 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4386 level = (level - 1) | 1;
4389 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4390 level = (level - 1) | 1;
4393 if (level < -2048 || level > 2047)
4394 fprintf(stderr, "unquant error %d %d\n", i, level);
4401 quant_matrix = s->inter_matrix;
4402 for(;i<=nCoeffs;i++) {
4403 int j= s->intra_scantable.permutated[i];
4408 level = (((level << 1) + 1) * qscale *
4409 ((int) (quant_matrix[j]))) >> 4;
4410 level = (level - 1) | 1;
4413 level = (((level << 1) + 1) * qscale *
4414 ((int) (quant_matrix[j]))) >> 4;
4415 level = (level - 1) | 1;
4418 if (level < -2048 || level > 2047)
4419 fprintf(stderr, "unquant error %d %d\n", i, level);
4427 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
4428 DCTELEM *block, int n, int qscale)
4430 int i, level, nCoeffs;
4431 const uint16_t *quant_matrix;
4433 if(s->alternate_scan) nCoeffs= 63;
4434 else nCoeffs= s->block_last_index[n];
4438 block[0] = block[0] * s->y_dc_scale;
4440 block[0] = block[0] * s->c_dc_scale;
4441 quant_matrix = s->intra_matrix;
4442 for(i=1;i<=nCoeffs;i++) {
4443 int j= s->intra_scantable.permutated[i];
4448 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4451 level = (int)(level * qscale * quant_matrix[j]) >> 3;
4454 if (level < -2048 || level > 2047)
4455 fprintf(stderr, "unquant error %d %d\n", i, level);
4463 quant_matrix = s->inter_matrix;
4464 for(;i<=nCoeffs;i++) {
4465 int j= s->intra_scantable.permutated[i];
4470 level = (((level << 1) + 1) * qscale *
4471 ((int) (quant_matrix[j]))) >> 4;
4474 level = (((level << 1) + 1) * qscale *
4475 ((int) (quant_matrix[j]))) >> 4;
4478 if (level < -2048 || level > 2047)
4479 fprintf(stderr, "unquant error %d %d\n", i, level);
4490 static void dct_unquantize_h263_c(MpegEncContext *s,
4491 DCTELEM *block, int n, int qscale)
4493 int i, level, qmul, qadd;
4496 assert(s->block_last_index[n]>=0);
4498 qadd = (qscale - 1) | 1;
4504 block[0] = block[0] * s->y_dc_scale;
4506 block[0] = block[0] * s->c_dc_scale;
4510 nCoeffs= 63; //does not allways use zigzag table
4513 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
4516 for(;i<=nCoeffs;i++) {
4520 level = level * qmul - qadd;
4522 level = level * qmul + qadd;
4525 if (level < -2048 || level > 2047)
4526 fprintf(stderr, "unquant error %d %d\n", i, level);
4534 static const AVOption mpeg4_options[] =
4536 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
4537 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
4538 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
4539 bit_rate_tolerance, 4, 240000000, 8000),
4540 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
4541 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
4542 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
4543 rc_eq, "tex^qComp,option1,options2", 0),
4544 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
4545 rc_min_rate, 4, 24000000, 0),
4546 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
4547 rc_max_rate, 4, 24000000, 0),
4548 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
4549 rc_buffer_aggressivity, 4, 24000000, 0),
4550 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
4551 rc_initial_cplx, 0., 9999999., 0),
4552 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
4553 i_quant_factor, 0., 0., 0),
4554 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
4555 i_quant_factor, -999999., 999999., 0),
4556 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
4557 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
4558 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
4559 lumi_masking, 0., 999999., 0),
4560 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
4561 temporal_cplx_masking, 0., 999999., 0),
4562 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
4563 spatial_cplx_masking, 0., 999999., 0),
4564 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
4565 p_masking, 0., 999999., 0),
4566 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
4567 dark_masking, 0., 999999., 0),
4568 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
4569 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
4571 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
4573 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
4576 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
4577 me_cmp, 0, 24000000, 0),
4578 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
4579 me_sub_cmp, 0, 24000000, 0),
4582 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
4583 dia_size, 0, 24000000, 0),
4584 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
4585 last_predictor_count, 0, 24000000, 0),
4587 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
4588 pre_me, 0, 24000000, 0),
4589 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
4590 me_pre_cmp, 0, 24000000, 0),
4592 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
4593 me_range, 0, 24000000, 0),
4594 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
4595 pre_dia_size, 0, 24000000, 0),
4596 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
4597 me_subpel_quality, 0, 24000000, 0),
4598 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
4599 me_range, 0, 24000000, 0),
4600 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
4601 flags, CODEC_FLAG_PSNR, 0),
4602 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
4604 AVOPTION_SUB(avoptions_common),
4608 #ifdef CONFIG_ENCODERS
4610 AVCodec mpeg1video_encoder = {
4613 CODEC_ID_MPEG1VIDEO,
4614 sizeof(MpegEncContext),
4622 AVCodec mpeg2video_encoder = {
4625 CODEC_ID_MPEG2VIDEO,
4626 sizeof(MpegEncContext),
4632 AVCodec h263_encoder = {
4636 sizeof(MpegEncContext),
4642 AVCodec h263p_encoder = {
4646 sizeof(MpegEncContext),
4652 AVCodec flv_encoder = {
4656 sizeof(MpegEncContext),
4662 AVCodec rv10_encoder = {
4666 sizeof(MpegEncContext),
4672 AVCodec mpeg4_encoder = {
4676 sizeof(MpegEncContext),
4680 .options = mpeg4_options,
4683 AVCodec msmpeg4v1_encoder = {
4687 sizeof(MpegEncContext),
4691 .options = mpeg4_options,
4694 AVCodec msmpeg4v2_encoder = {
4698 sizeof(MpegEncContext),
4702 .options = mpeg4_options,
4705 AVCodec msmpeg4v3_encoder = {
4709 sizeof(MpegEncContext),
4713 .options = mpeg4_options,
4716 AVCodec wmv1_encoder = {
4720 sizeof(MpegEncContext),
4724 .options = mpeg4_options,
4729 AVCodec mjpeg_encoder = {
4733 sizeof(MpegEncContext),
4739 #endif //CONFIG_ENCODERS