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>
25 #include "mpegvideo.h"
26 #include "simple_idct.h"
29 #include "fastmemcpy.h"
35 static void encode_picture(MpegEncContext
*s
, int picture_number
);
36 static void dct_unquantize_mpeg1_c(MpegEncContext
*s
,
37 DCTELEM
*block
, int n
, int qscale
);
38 static void dct_unquantize_mpeg2_c(MpegEncContext
*s
,
39 DCTELEM
*block
, int n
, int qscale
);
40 static void dct_unquantize_h263_c(MpegEncContext
*s
,
41 DCTELEM
*block
, int n
, int qscale
);
42 static void draw_edges_c(UINT8
*buf
, int wrap
, int width
, int height
, int w
);
43 static int dct_quantize_c(MpegEncContext
*s
, DCTELEM
*block
, int n
, int qscale
, int *overflow
);
45 void (*draw_edges
)(UINT8
*buf
, int wrap
, int width
, int height
, int w
)= draw_edges_c
;
46 static void emulated_edge_mc(MpegEncContext
*s
, UINT8
*src
, int linesize
, int block_w
, int block_h
,
47 int src_x
, int src_y
, int w
, int h
);
50 /* enable all paranoid tests for rounding, overflows, etc... */
56 /* for jpeg fast DCT */
59 static const uint16_t aanscales
[64] = {
60 /* precomputed values scaled up by 14 bits */
61 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
62 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
63 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
64 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
65 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
66 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
67 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
68 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
71 /* Input permutation for the simple_idct_mmx */
72 static const uint8_t simple_mmx_permutation
[64]={
73 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
74 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
75 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
76 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
77 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
78 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
79 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
80 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
83 static const uint8_t h263_chroma_roundtab
[16] = {
84 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
87 static UINT16 (*default_mv_penalty
)[MAX_MV
*2+1]=NULL
;
88 static UINT8 default_fcode_tab
[MAX_MV
*2+1];
90 /* default motion estimation */
91 int motion_estimation_method
= ME_EPZS
;
93 static void convert_matrix(MpegEncContext
*s
, int (*qmat
)[64], uint16_t (*qmat16
)[64], uint16_t (*qmat16_bias
)[64],
94 const UINT16
*quant_matrix
, int bias
, int qmin
, int qmax
)
98 for(qscale
=qmin
; qscale
<=qmax
; qscale
++){
100 if (s
->fdct
== ff_jpeg_fdct_islow
) {
102 const int j
= s
->idct_permutation
[i
];
103 /* 16 <= qscale * quant_matrix[i] <= 7905 */
104 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
105 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
106 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
108 qmat
[qscale
][i
] = (int)((UINT64_C(1) << QMAT_SHIFT
) /
109 (qscale
* quant_matrix
[j
]));
111 } else if (s
->fdct
== fdct_ifast
) {
113 const int j
= s
->idct_permutation
[i
];
114 /* 16 <= qscale * quant_matrix[i] <= 7905 */
115 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
116 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
117 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
119 qmat
[qscale
][i
] = (int)((UINT64_C(1) << (QMAT_SHIFT
+ 14)) /
120 (aanscales
[i
] * qscale
* quant_matrix
[j
]));
124 const int j
= s
->idct_permutation
[i
];
125 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
126 So 16 <= qscale * quant_matrix[i] <= 7905
127 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
128 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
130 qmat
[qscale
][i
] = (1 << QMAT_SHIFT_MMX
) / (qscale
* quant_matrix
[i
]);
131 qmat16
[qscale
][i
] = (1 << QMAT_SHIFT_MMX
) / (qscale
* quant_matrix
[j
]);
133 if(qmat16
[qscale
][i
]==0 || qmat16
[qscale
][i
]==128*256) qmat16
[qscale
][i
]=128*256-1;
134 qmat16_bias
[qscale
][i
]= ROUNDED_DIV(bias
<<(16-QUANT_BIAS_SHIFT
), qmat16
[qscale
][i
]);
139 // move into common.c perhaps
140 #define CHECKED_ALLOCZ(p, size)\
142 p= av_mallocz(size);\
149 void ff_init_scantable(MpegEncContext
*s
, ScanTable
*st
, const UINT8
*src_scantable
){
153 st
->scantable
= src_scantable
;
157 j
= src_scantable
[i
];
158 st
->permutated
[i
] = s
->idct_permutation
[j
];
167 j
= st
->permutated
[i
];
169 st
->raster_end
[i
]= end
;
173 /* XXX: those functions should be suppressed ASAP when all IDCTs are
175 // *FIXME* this is ugly hack using local static
176 static void (*ff_put_pixels_clamped
)(const DCTELEM
*block
, UINT8
*pixels
, int line_size
);
177 static void (*ff_add_pixels_clamped
)(const DCTELEM
*block
, UINT8
*pixels
, int line_size
);
178 static void ff_jref_idct_put(UINT8
*dest
, int line_size
, DCTELEM
*block
)
181 ff_put_pixels_clamped(block
, dest
, line_size
);
183 static void ff_jref_idct_add(UINT8
*dest
, int line_size
, DCTELEM
*block
)
186 ff_add_pixels_clamped(block
, dest
, line_size
);
189 /* init common dct for both encoder and decoder */
190 int DCT_common_init(MpegEncContext
*s
)
194 ff_put_pixels_clamped
= s
->dsp
.put_pixels_clamped
;
195 ff_add_pixels_clamped
= s
->dsp
.add_pixels_clamped
;
197 s
->dct_unquantize_h263
= dct_unquantize_h263_c
;
198 s
->dct_unquantize_mpeg1
= dct_unquantize_mpeg1_c
;
199 s
->dct_unquantize_mpeg2
= dct_unquantize_mpeg2_c
;
200 s
->dct_quantize
= dct_quantize_c
;
202 if(s
->avctx
->dct_algo
==FF_DCT_FASTINT
)
203 s
->fdct
= fdct_ifast
;
205 s
->fdct
= ff_jpeg_fdct_islow
; //slow/accurate/default
207 if(s
->avctx
->idct_algo
==FF_IDCT_INT
){
208 s
->idct_put
= ff_jref_idct_put
;
209 s
->idct_add
= ff_jref_idct_add
;
210 s
->idct_permutation_type
= FF_LIBMPEG2_IDCT_PERM
;
211 }else{ //accurate/default
212 s
->idct_put
= simple_idct_put
;
213 s
->idct_add
= simple_idct_add
;
214 s
->idct_permutation_type
= FF_NO_IDCT_PERM
;
218 MPV_common_init_mmx(s
);
221 MPV_common_init_axp(s
);
224 MPV_common_init_mlib(s
);
227 MPV_common_init_mmi(s
);
230 MPV_common_init_armv4l(s
);
233 MPV_common_init_ppc(s
);
236 switch(s
->idct_permutation_type
){
237 case FF_NO_IDCT_PERM
:
239 s
->idct_permutation
[i
]= i
;
241 case FF_LIBMPEG2_IDCT_PERM
:
243 s
->idct_permutation
[i
]= (i
& 0x38) | ((i
& 6) >> 1) | ((i
& 1) << 2);
245 case FF_SIMPLE_IDCT_PERM
:
247 s
->idct_permutation
[i
]= simple_mmx_permutation
[i
];
249 case FF_TRANSPOSE_IDCT_PERM
:
251 s
->idct_permutation
[i
]= ((i
&7)<<3) | (i
>>3);
254 fprintf(stderr
, "Internal error, IDCT permutation not set\n");
259 /* load & permutate scantables
260 note: only wmv uses differnt ones
262 ff_init_scantable(s
, &s
->inter_scantable
, ff_zigzag_direct
);
263 ff_init_scantable(s
, &s
->intra_scantable
, ff_zigzag_direct
);
264 ff_init_scantable(s
, &s
->intra_h_scantable
, ff_alternate_horizontal_scan
);
265 ff_init_scantable(s
, &s
->intra_v_scantable
, ff_alternate_vertical_scan
);
271 * allocates a Picture
272 * The pixels are allocated/set by calling get_buffer() if shared=0
274 static int alloc_picture(MpegEncContext
*s
, Picture
*pic
, int shared
){
277 assert(pic
->data
[0]);
278 assert(pic
->type
== 0 || pic
->type
== FF_BUFFER_TYPE_SHARED
);
279 pic
->type
= FF_BUFFER_TYPE_SHARED
;
283 assert(!pic
->data
[0]);
285 r
= s
->avctx
->get_buffer(s
->avctx
, (AVFrame
*)pic
);
287 if(r
<0 || !pic
->age
|| !pic
->type
|| !pic
->data
[0]){
288 fprintf(stderr
, "get_buffer() failed (%d %d %d %X)\n", r
, pic
->age
, pic
->type
, (int)pic
->data
[0]);
292 if(s
->linesize
&& (s
->linesize
!= pic
->linesize
[0] || s
->uvlinesize
!= pic
->linesize
[1])){
293 fprintf(stderr
, "get_buffer() failed (stride changed)\n");
297 if(pic
->linesize
[1] != pic
->linesize
[2]){
298 fprintf(stderr
, "get_buffer() failed (uv stride missmatch)\n");
302 s
->linesize
= pic
->linesize
[0];
303 s
->uvlinesize
= pic
->linesize
[1];
306 if(pic
->qscale_table
==NULL
){
308 CHECKED_ALLOCZ(pic
->mb_var
, s
->mb_num
* sizeof(INT16
))
309 CHECKED_ALLOCZ(pic
->mc_mb_var
, s
->mb_num
* sizeof(INT16
))
310 CHECKED_ALLOCZ(pic
->mb_mean
, s
->mb_num
* sizeof(INT8
))
313 CHECKED_ALLOCZ(pic
->mbskip_table
, s
->mb_num
* sizeof(UINT8
)+1) //the +1 is for the slice end check
314 CHECKED_ALLOCZ(pic
->qscale_table
, s
->mb_num
* sizeof(UINT8
))
315 pic
->qstride
= s
->mb_width
;
319 fail
: //for the CHECKED_ALLOCZ macro
324 * deallocates a picture
326 static void free_picture(MpegEncContext
*s
, Picture
*pic
){
329 if(pic
->data
[0] && pic
->type
!=FF_BUFFER_TYPE_SHARED
){
330 s
->avctx
->release_buffer(s
->avctx
, (AVFrame
*)pic
);
333 av_freep(&pic
->mb_var
);
334 av_freep(&pic
->mc_mb_var
);
335 av_freep(&pic
->mb_mean
);
336 av_freep(&pic
->mbskip_table
);
337 av_freep(&pic
->qscale_table
);
339 if(pic
->type
== FF_BUFFER_TYPE_INTERNAL
){
341 av_freep(&pic
->base
[i
]);
344 av_freep(&pic
->opaque
);
346 }else if(pic
->type
== FF_BUFFER_TYPE_SHARED
){
355 /* init common structure for both encoder and decoder */
356 int MPV_common_init(MpegEncContext
*s
)
358 int y_size
, c_size
, yc_size
, i
;
360 dsputil_init(&s
->dsp
, s
->avctx
->dsp_mask
);
363 s
->flags
= s
->avctx
->flags
;
365 s
->mb_width
= (s
->width
+ 15) / 16;
366 s
->mb_height
= (s
->height
+ 15) / 16;
368 /* set default edge pos, will be overriden in decode_header if needed */
369 s
->h_edge_pos
= s
->mb_width
*16;
370 s
->v_edge_pos
= s
->mb_height
*16;
372 s
->mb_num
= s
->mb_width
* s
->mb_height
;
374 y_size
= (2 * s
->mb_width
+ 2) * (2 * s
->mb_height
+ 2);
375 c_size
= (s
->mb_width
+ 2) * (s
->mb_height
+ 2);
376 yc_size
= y_size
+ 2 * c_size
;
378 /* convert fourcc to upper case */
379 s
->avctx
->fourcc
= toupper( s
->avctx
->fourcc
&0xFF)
380 + (toupper((s
->avctx
->fourcc
>>8 )&0xFF)<<8 )
381 + (toupper((s
->avctx
->fourcc
>>16)&0xFF)<<16)
382 + (toupper((s
->avctx
->fourcc
>>24)&0xFF)<<24);
384 CHECKED_ALLOCZ(s
->edge_emu_buffer
, (s
->width
+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
386 s
->avctx
->coded_frame
= (AVFrame
*)&s
->current_picture
;
389 int mv_table_size
= (s
->mb_width
+2)*(s
->mb_height
+2);
391 /* Allocate MV tables */
392 CHECKED_ALLOCZ(s
->p_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
393 CHECKED_ALLOCZ(s
->b_forw_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
394 CHECKED_ALLOCZ(s
->b_back_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
395 CHECKED_ALLOCZ(s
->b_bidir_forw_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
396 CHECKED_ALLOCZ(s
->b_bidir_back_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
397 CHECKED_ALLOCZ(s
->b_direct_forw_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
398 CHECKED_ALLOCZ(s
->b_direct_back_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
399 CHECKED_ALLOCZ(s
->b_direct_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
401 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
402 CHECKED_ALLOCZ(s
->me_scratchpad
, s
->width
*2*16*3*sizeof(uint8_t))
404 CHECKED_ALLOCZ(s
->me_map
, ME_MAP_SIZE
*sizeof(uint32_t))
405 CHECKED_ALLOCZ(s
->me_score_map
, ME_MAP_SIZE
*sizeof(uint16_t))
407 if(s
->codec_id
==CODEC_ID_MPEG4
){
408 CHECKED_ALLOCZ(s
->tex_pb_buffer
, PB_BUFFER_SIZE
);
409 CHECKED_ALLOCZ( s
->pb2_buffer
, PB_BUFFER_SIZE
);
412 if(s
->msmpeg4_version
){
413 CHECKED_ALLOCZ(s
->ac_stats
, 2*2*(MAX_LEVEL
+1)*(MAX_RUN
+1)*2*sizeof(int));
415 CHECKED_ALLOCZ(s
->avctx
->stats_out
, 256);
418 CHECKED_ALLOCZ(s
->error_status_table
, s
->mb_num
*sizeof(UINT8
))
420 if (s
->out_format
== FMT_H263
|| s
->encoding
) {
422 /* Allocate MB type table */
423 CHECKED_ALLOCZ(s
->mb_type
, s
->mb_num
* sizeof(UINT8
))
426 size
= (2 * s
->mb_width
+ 2) * (2 * s
->mb_height
+ 2);
427 CHECKED_ALLOCZ(s
->motion_val
, size
* 2 * sizeof(INT16
));
430 if(s
->codec_id
==CODEC_ID_MPEG4
){
431 /* interlaced direct mode decoding tables */
432 CHECKED_ALLOCZ(s
->field_mv_table
, s
->mb_num
*2*2 * sizeof(INT16
))
433 CHECKED_ALLOCZ(s
->field_select_table
, s
->mb_num
*2* sizeof(INT8
))
435 /* 4mv b frame decoding table */
436 //note this is needed for h263 without b frames too (segfault on damaged streams otherwise)
437 CHECKED_ALLOCZ(s
->co_located_type_table
, s
->mb_num
* sizeof(UINT8
))
438 if (s
->out_format
== FMT_H263
) {
440 CHECKED_ALLOCZ(s
->ac_val
[0], yc_size
* sizeof(INT16
) * 16);
441 s
->ac_val
[1] = s
->ac_val
[0] + y_size
;
442 s
->ac_val
[2] = s
->ac_val
[1] + c_size
;
445 CHECKED_ALLOCZ(s
->coded_block
, y_size
);
447 /* divx501 bitstream reorder buffer */
448 CHECKED_ALLOCZ(s
->bitstream_buffer
, BITSTREAM_BUFFER_SIZE
);
450 /* cbp, ac_pred, pred_dir */
451 CHECKED_ALLOCZ(s
->cbp_table
, s
->mb_num
* sizeof(UINT8
))
452 CHECKED_ALLOCZ(s
->pred_dir_table
, s
->mb_num
* sizeof(UINT8
))
455 if (s
->h263_pred
|| s
->h263_plus
|| !s
->encoding
) {
457 //MN: we need these for error resilience of intra-frames
458 CHECKED_ALLOCZ(s
->dc_val
[0], yc_size
* sizeof(INT16
));
459 s
->dc_val
[1] = s
->dc_val
[0] + y_size
;
460 s
->dc_val
[2] = s
->dc_val
[1] + c_size
;
461 for(i
=0;i
<yc_size
;i
++)
462 s
->dc_val
[0][i
] = 1024;
465 /* which mb is a intra block */
466 CHECKED_ALLOCZ(s
->mbintra_table
, s
->mb_num
);
467 memset(s
->mbintra_table
, 1, s
->mb_num
);
469 /* default structure is frame */
470 s
->picture_structure
= PICT_FRAME
;
472 /* init macroblock skip table */
473 CHECKED_ALLOCZ(s
->mbskip_table
, s
->mb_num
+1);
474 //Note the +1 is for a quicker mpeg4 slice_end detection
476 s
->block
= s
->blocks
[0];
478 s
->parse_context
.state
= -1;
480 s
->context_initialized
= 1;
490 /* init common structure for both encoder and decoder */
491 void MPV_common_end(MpegEncContext
*s
)
495 av_freep(&s
->mb_type
);
496 av_freep(&s
->p_mv_table
);
497 av_freep(&s
->b_forw_mv_table
);
498 av_freep(&s
->b_back_mv_table
);
499 av_freep(&s
->b_bidir_forw_mv_table
);
500 av_freep(&s
->b_bidir_back_mv_table
);
501 av_freep(&s
->b_direct_forw_mv_table
);
502 av_freep(&s
->b_direct_back_mv_table
);
503 av_freep(&s
->b_direct_mv_table
);
504 av_freep(&s
->motion_val
);
505 av_freep(&s
->dc_val
[0]);
506 av_freep(&s
->ac_val
[0]);
507 av_freep(&s
->coded_block
);
508 av_freep(&s
->mbintra_table
);
509 av_freep(&s
->cbp_table
);
510 av_freep(&s
->pred_dir_table
);
511 av_freep(&s
->me_scratchpad
);
512 av_freep(&s
->me_map
);
513 av_freep(&s
->me_score_map
);
515 av_freep(&s
->mbskip_table
);
516 av_freep(&s
->bitstream_buffer
);
517 av_freep(&s
->tex_pb_buffer
);
518 av_freep(&s
->pb2_buffer
);
519 av_freep(&s
->edge_emu_buffer
);
520 av_freep(&s
->co_located_type_table
);
521 av_freep(&s
->field_mv_table
);
522 av_freep(&s
->field_select_table
);
523 av_freep(&s
->avctx
->stats_out
);
524 av_freep(&s
->ac_stats
);
525 av_freep(&s
->error_status_table
);
527 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
528 free_picture(s
, &s
->picture
[i
]);
530 s
->context_initialized
= 0;
533 /* init video encoder */
534 int MPV_encode_init(AVCodecContext
*avctx
)
536 MpegEncContext
*s
= avctx
->priv_data
;
539 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
541 s
->bit_rate
= avctx
->bit_rate
;
542 s
->bit_rate_tolerance
= avctx
->bit_rate_tolerance
;
543 s
->frame_rate
= avctx
->frame_rate
;
544 s
->width
= avctx
->width
;
545 s
->height
= avctx
->height
;
546 if(avctx
->gop_size
> 600){
547 fprintf(stderr
, "Warning keyframe interval too large! reducing it ...\n");
550 s
->gop_size
= avctx
->gop_size
;
551 s
->rtp_mode
= avctx
->rtp_mode
;
552 s
->rtp_payload_size
= avctx
->rtp_payload_size
;
553 if (avctx
->rtp_callback
)
554 s
->rtp_callback
= avctx
->rtp_callback
;
555 s
->qmin
= avctx
->qmin
;
556 s
->qmax
= avctx
->qmax
;
557 s
->max_qdiff
= avctx
->max_qdiff
;
558 s
->qcompress
= avctx
->qcompress
;
559 s
->qblur
= avctx
->qblur
;
561 s
->flags
= avctx
->flags
;
562 s
->max_b_frames
= avctx
->max_b_frames
;
563 s
->b_frame_strategy
= avctx
->b_frame_strategy
;
564 s
->codec_id
= avctx
->codec
->id
;
565 s
->luma_elim_threshold
= avctx
->luma_elim_threshold
;
566 s
->chroma_elim_threshold
= avctx
->chroma_elim_threshold
;
567 s
->strict_std_compliance
= avctx
->strict_std_compliance
;
568 s
->data_partitioning
= avctx
->flags
& CODEC_FLAG_PART
;
569 s
->mpeg_quant
= avctx
->mpeg_quant
;
571 if (s
->gop_size
<= 1) {
579 if (avctx
->me_method
== 0)
580 /* For compatibility */
581 s
->me_method
= motion_estimation_method
;
583 s
->me_method
= avctx
->me_method
;
586 s
->fixed_qscale
= (avctx
->flags
& CODEC_FLAG_QSCALE
);
588 s
->adaptive_quant
= ( s
->avctx
->lumi_masking
589 || s
->avctx
->dark_masking
590 || s
->avctx
->temporal_cplx_masking
591 || s
->avctx
->spatial_cplx_masking
592 || s
->avctx
->p_masking
)
595 s
->progressive_sequence
= !(avctx
->flags
& CODEC_FLAG_INTERLACED_DCT
);
597 switch(avctx
->codec
->id
) {
598 case CODEC_ID_MPEG1VIDEO
:
599 s
->out_format
= FMT_MPEG1
;
600 avctx
->delay
=0; //FIXME not sure, should check the spec
603 s
->out_format
= FMT_MJPEG
;
604 s
->intra_only
= 1; /* force intra only for jpeg */
605 s
->mjpeg_write_tables
= 1; /* write all tables */
606 s
->mjpeg_data_only_frames
= 0; /* write all the needed headers */
607 s
->mjpeg_vsample
[0] = 2; /* set up default sampling factors */
608 s
->mjpeg_vsample
[1] = 1; /* the only currently supported values */
609 s
->mjpeg_vsample
[2] = 1;
610 s
->mjpeg_hsample
[0] = 2;
611 s
->mjpeg_hsample
[1] = 1;
612 s
->mjpeg_hsample
[2] = 1;
613 if (mjpeg_init(s
) < 0)
619 if (h263_get_picture_format(s
->width
, s
->height
) == 7) {
620 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
623 s
->out_format
= FMT_H263
;
628 s
->out_format
= FMT_H263
;
630 s
->unrestricted_mv
= 1;
633 /* These are just to be sure */
640 s
->out_format
= FMT_H263
;
646 s
->out_format
= FMT_H263
;
648 s
->unrestricted_mv
= 1;
649 s
->low_delay
= s
->max_b_frames
? 0 : 1;
650 avctx
->delay
= s
->low_delay
? 0 : (s
->max_b_frames
+ 1);
652 case CODEC_ID_MSMPEG4V1
:
653 s
->out_format
= FMT_H263
;
656 s
->unrestricted_mv
= 1;
657 s
->msmpeg4_version
= 1;
661 case CODEC_ID_MSMPEG4V2
:
662 s
->out_format
= FMT_H263
;
665 s
->unrestricted_mv
= 1;
666 s
->msmpeg4_version
= 2;
670 case CODEC_ID_MSMPEG4V3
:
671 s
->out_format
= FMT_H263
;
674 s
->unrestricted_mv
= 1;
675 s
->msmpeg4_version
= 3;
680 s
->out_format
= FMT_H263
;
683 s
->unrestricted_mv
= 1;
684 s
->msmpeg4_version
= 4;
689 s
->out_format
= FMT_H263
;
692 s
->unrestricted_mv
= 1;
693 s
->msmpeg4_version
= 5;
701 { /* set up some save defaults, some codecs might override them later */
707 default_mv_penalty
= av_mallocz( sizeof(UINT16
)*(MAX_FCODE
+1)*(2*MAX_MV
+1) );
708 memset(default_mv_penalty
, 0, sizeof(UINT16
)*(MAX_FCODE
+1)*(2*MAX_MV
+1));
709 memset(default_fcode_tab
, 0, sizeof(UINT8
)*(2*MAX_MV
+1));
711 for(i
=-16; i
<16; i
++){
712 default_fcode_tab
[i
+ MAX_MV
]= 1;
716 s
->mv_penalty
= default_mv_penalty
;
717 s
->fcode_tab
= default_fcode_tab
;
719 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
721 /* dont use mv_penalty table for crap MV as it would be confused */
722 if (s
->me_method
< ME_EPZS
) s
->mv_penalty
= default_mv_penalty
;
727 if (MPV_common_init(s
) < 0)
730 #ifdef CONFIG_ENCODERS
731 if (s
->out_format
== FMT_H263
)
733 else if (s
->out_format
== FMT_MPEG1
)
734 ff_mpeg1_encode_init(s
);
735 if(s
->msmpeg4_version
)
736 ff_msmpeg4_encode_init(s
);
739 /* init default q matrix */
741 int j
= s
->idct_permutation
[i
];
742 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->mpeg_quant
){
743 s
->intra_matrix
[j
] = ff_mpeg4_default_intra_matrix
[i
];
744 s
->inter_matrix
[j
] = ff_mpeg4_default_non_intra_matrix
[i
];
745 }else if(s
->out_format
== FMT_H263
){
747 s
->inter_matrix
[j
] = ff_mpeg1_default_non_intra_matrix
[i
];
749 s
->intra_matrix
[j
] = ff_mpeg1_default_intra_matrix
[i
];
750 s
->inter_matrix
[j
] = ff_mpeg1_default_non_intra_matrix
[i
];
754 /* precompute matrix */
755 /* for mjpeg, we do include qscale in the matrix */
756 if (s
->out_format
!= FMT_MJPEG
) {
757 convert_matrix(s
, s
->q_intra_matrix
, s
->q_intra_matrix16
, s
->q_intra_matrix16_bias
,
758 s
->intra_matrix
, s
->intra_quant_bias
, 1, 31);
759 convert_matrix(s
, s
->q_inter_matrix
, s
->q_inter_matrix16
, s
->q_inter_matrix16_bias
,
760 s
->inter_matrix
, s
->inter_quant_bias
, 1, 31);
763 if(ff_rate_control_init(s
) < 0)
766 s
->picture_number
= 0;
767 s
->picture_in_gop_number
= 0;
768 s
->fake_picture_number
= 0;
769 /* motion detector init */
776 int MPV_encode_end(AVCodecContext
*avctx
)
778 MpegEncContext
*s
= avctx
->priv_data
;
784 ff_rate_control_uninit(s
);
787 if (s
->out_format
== FMT_MJPEG
)
793 /* draw the edges of width 'w' of an image of size width, height */
794 //FIXME check that this is ok for mpeg4 interlaced
795 static void draw_edges_c(UINT8
*buf
, int wrap
, int width
, int height
, int w
)
797 UINT8
*ptr
, *last_line
;
800 last_line
= buf
+ (height
- 1) * wrap
;
803 memcpy(buf
- (i
+ 1) * wrap
, buf
, width
);
804 memcpy(last_line
+ (i
+ 1) * wrap
, last_line
, width
);
808 for(i
=0;i
<height
;i
++) {
809 memset(ptr
- w
, ptr
[0], w
);
810 memset(ptr
+ width
, ptr
[width
-1], w
);
815 memset(buf
- (i
+ 1) * wrap
- w
, buf
[0], w
); /* top left */
816 memset(buf
- (i
+ 1) * wrap
+ width
, buf
[width
-1], w
); /* top right */
817 memset(last_line
+ (i
+ 1) * wrap
- w
, last_line
[0], w
); /* top left */
818 memset(last_line
+ (i
+ 1) * wrap
+ width
, last_line
[width
-1], w
); /* top right */
822 static int find_unused_picture(MpegEncContext
*s
, int shared
){
826 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
827 if(s
->picture
[i
].data
[0]==NULL
&& s
->picture
[i
].type
==0) break;
830 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
831 if(s
->picture
[i
].data
[0]==NULL
&& s
->picture
[i
].type
!=0) break;
833 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
834 if(s
->picture
[i
].data
[0]==NULL
) break;
838 assert(i
<MAX_PICTURE_COUNT
);
842 /* generic function for encode/decode called before a frame is coded/decoded */
843 int MPV_frame_start(MpegEncContext
*s
, AVCodecContext
*avctx
)
850 /* mark&release old frames */
851 if (s
->pict_type
!= B_TYPE
&& s
->last_picture
.data
[0]) {
852 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
853 //printf("%8X %d %d %X %X\n", s->picture[i].data[0], s->picture[i].type, i, s->next_picture.data[0], s->last_picture.data[0]);
854 if(s
->picture
[i
].data
[0] == s
->last_picture
.data
[0]){
855 // s->picture[i].reference=0;
856 avctx
->release_buffer(avctx
, (AVFrame
*)&s
->picture
[i
]);
860 assert(i
<MAX_PICTURE_COUNT
);
862 /* release forgotten pictures */
863 /* if(mpeg124/h263) */
865 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
866 if(s
->picture
[i
].data
[0] && s
->picture
[i
].data
[0] != s
->next_picture
.data
[0] && s
->picture
[i
].reference
){
867 fprintf(stderr
, "releasing zombie picture\n");
868 avctx
->release_buffer(avctx
, (AVFrame
*)&s
->picture
[i
]);
875 i
= find_unused_picture(s
, 0);
877 pic
= (AVFrame
*)&s
->picture
[i
];
878 pic
->reference
= s
->pict_type
!= B_TYPE
;
879 pic
->coded_picture_number
= s
->current_picture
.coded_picture_number
+1;
881 alloc_picture(s
, (Picture
*)pic
, 0);
883 s
->current_picture
= s
->picture
[i
];
886 if (s
->pict_type
!= B_TYPE
) {
887 s
->last_picture
= s
->next_picture
;
888 s
->next_picture
= s
->current_picture
;
891 if(s
->pict_type
!= I_TYPE
&& s
->last_picture
.data
[0]==NULL
){
892 fprintf(stderr
, "warning: first frame is no keyframe\n");
893 assert(s
->pict_type
!= B_TYPE
); //these should have been dropped if we dont have a reference
897 s
->hurry_up
= s
->avctx
->hurry_up
;
898 s
->error_resilience
= avctx
->error_resilience
;
900 /* set dequantizer, we cant do it during init as it might change for mpeg4
901 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
902 if(s
->out_format
== FMT_H263
){
904 s
->dct_unquantize
= s
->dct_unquantize_mpeg2
;
906 s
->dct_unquantize
= s
->dct_unquantize_h263
;
908 s
->dct_unquantize
= s
->dct_unquantize_mpeg1
;
913 /* generic function for encode/decode called after a frame has been coded/decoded */
914 void MPV_frame_end(MpegEncContext
*s
)
917 /* draw edge for correct motion prediction if outside */
918 if(s
->codec_id
!=CODEC_ID_SVQ1
){
919 if (s
->pict_type
!= B_TYPE
&& !s
->intra_only
&& !(s
->flags
&CODEC_FLAG_EMU_EDGE
)) {
920 draw_edges(s
->current_picture
.data
[0], s
->linesize
, s
->h_edge_pos
, s
->v_edge_pos
, EDGE_WIDTH
);
921 draw_edges(s
->current_picture
.data
[1], s
->uvlinesize
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1, EDGE_WIDTH
/2);
922 draw_edges(s
->current_picture
.data
[2], s
->uvlinesize
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1, EDGE_WIDTH
/2);
927 s
->last_pict_type
= s
->pict_type
;
928 if(s
->pict_type
!=B_TYPE
){
929 s
->last_non_b_pict_type
= s
->pict_type
;
932 s
->current_picture
.quality
= s
->qscale
; //FIXME get average of qscale_table
933 s
->current_picture
.pict_type
= s
->pict_type
;
934 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
936 /* copy back current_picture variables */
937 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
938 if(s
->picture
[i
].data
[0] == s
->current_picture
.data
[0]){
939 s
->picture
[i
]= s
->current_picture
;
943 assert(i
<MAX_PICTURE_COUNT
);
945 /* release non refernce frames */
946 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
947 if(s
->picture
[i
].data
[0] && !s
->picture
[i
].reference
/*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/)
948 s
->avctx
->release_buffer(s
->avctx
, (AVFrame
*)&s
->picture
[i
]);
952 static int get_sae(uint8_t *src
, int ref
, int stride
){
958 acc
+= ABS(src
[x
+y
*stride
] - ref
);
965 static int get_intra_count(MpegEncContext
*s
, uint8_t *src
, uint8_t *ref
, int stride
){
972 for(y
=0; y
<h
; y
+=16){
973 for(x
=0; x
<w
; x
+=16){
974 int offset
= x
+ y
*stride
;
975 int sad
= s
->dsp
.pix_abs16x16(src
+ offset
, ref
+ offset
, stride
);
976 int mean
= (s
->dsp
.pix_sum(src
+ offset
, stride
) + 128)>>8;
977 int sae
= get_sae(src
+ offset
, mean
, stride
);
979 acc
+= sae
+ 500 < sad
;
986 static int load_input_picture(MpegEncContext
*s
, AVFrame
*pic_arg
){
989 const int encoding_delay
= s
->max_b_frames
;
992 if(encoding_delay
&& !(s
->flags
&CODEC_FLAG_INPUT_PRESERVED
)) direct
=0;
993 if(pic_arg
->linesize
[0] != s
->linesize
) direct
=0;
994 if(pic_arg
->linesize
[1] != s
->uvlinesize
) direct
=0;
995 if(pic_arg
->linesize
[2] != s
->uvlinesize
) direct
=0;
997 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1000 i
= find_unused_picture(s
, 1);
1002 pic
= (AVFrame
*)&s
->picture
[i
];
1006 pic
->data
[i
]= pic_arg
->data
[i
];
1007 pic
->linesize
[i
]= pic_arg
->linesize
[i
];
1009 alloc_picture(s
, (Picture
*)pic
, 1);
1011 i
= find_unused_picture(s
, 0);
1013 pic
= (AVFrame
*)&s
->picture
[i
];
1016 alloc_picture(s
, (Picture
*)pic
, 0);
1018 if( pic
->data
[0] == pic_arg
->data
[0]
1019 && pic
->data
[1] == pic_arg
->data
[1]
1020 && pic
->data
[2] == pic_arg
->data
[2]){
1023 int h_chroma_shift
, v_chroma_shift
;
1025 avcodec_get_chroma_sub_sample(s
->avctx
->pix_fmt
, &h_chroma_shift
, &v_chroma_shift
);
1028 int src_stride
= pic_arg
->linesize
[i
];
1029 int dst_stride
= i
? s
->uvlinesize
: s
->linesize
;
1030 int h_shift
= i
? h_chroma_shift
: 0;
1031 int v_shift
= i
? v_chroma_shift
: 0;
1032 int w
= s
->width
>>h_shift
;
1033 int h
= s
->height
>>v_shift
;
1034 uint8_t *src
= pic_arg
->data
[i
];
1035 uint8_t *dst
= pic
->data
[i
];
1037 if(src_stride
==dst_stride
)
1038 memcpy(dst
, src
, src_stride
*h
);
1041 memcpy(dst
, src
, w
);
1049 pic
->quality
= pic_arg
->quality
;
1050 pic
->pict_type
= pic_arg
->pict_type
;
1052 if(s
->input_picture
[encoding_delay
])
1053 pic
->display_picture_number
= s
->input_picture
[encoding_delay
]->display_picture_number
+ 1;
1055 /* shift buffer entries */
1056 for(i
=1; i
<MAX_PICTURE_COUNT
/*s->encoding_delay+1*/; i
++)
1057 s
->input_picture
[i
-1]= s
->input_picture
[i
];
1059 s
->input_picture
[encoding_delay
]= (Picture
*)pic
;
1064 static void select_input_picture(MpegEncContext
*s
){
1066 const int encoding_delay
= s
->max_b_frames
;
1067 int coded_pic_num
=0;
1069 if(s
->reordered_input_picture
[0])
1070 coded_pic_num
= s
->reordered_input_picture
[0]->coded_picture_number
+ 1;
1072 for(i
=1; i
<MAX_PICTURE_COUNT
; i
++)
1073 s
->reordered_input_picture
[i
-1]= s
->reordered_input_picture
[i
];
1074 s
->reordered_input_picture
[MAX_PICTURE_COUNT
-1]= NULL
;
1076 /* set next picture types & ordering */
1077 if(s
->reordered_input_picture
[0]==NULL
&& s
->input_picture
[0]){
1078 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s
->next_picture
.data
[0]==NULL
|| s
->intra_only
){
1079 s
->reordered_input_picture
[0]= s
->input_picture
[0];
1080 s
->reordered_input_picture
[0]->pict_type
= I_TYPE
;
1081 s
->reordered_input_picture
[0]->coded_picture_number
= coded_pic_num
;
1085 if(s
->flags
&CODEC_FLAG_PASS2
){
1086 for(i
=0; i
<s
->max_b_frames
+1; i
++){
1087 int pict_num
= s
->input_picture
[0]->display_picture_number
+ i
;
1088 int pict_type
= s
->rc_context
.entry
[pict_num
].new_pict_type
;
1089 s
->input_picture
[i
]->pict_type
= pict_type
;
1091 if(i
+ 1 >= s
->rc_context
.num_entries
) break;
1095 if(s
->input_picture
[0]->pict_type
){
1096 /* user selected pict_type */
1097 for(b_frames
=0; b_frames
<s
->max_b_frames
+1; b_frames
++){
1098 if(s
->input_picture
[b_frames
]->pict_type
!=B_TYPE
) break;
1101 if(b_frames
> s
->max_b_frames
){
1102 fprintf(stderr
, "warning, too many bframes in a row\n");
1103 b_frames
= s
->max_b_frames
;
1105 }else if(s
->b_frame_strategy
==0){
1106 b_frames
= s
->max_b_frames
;
1107 }else if(s
->b_frame_strategy
==1){
1108 for(i
=1; i
<s
->max_b_frames
+1; i
++){
1109 if(s
->input_picture
[i
]->b_frame_score
==0){
1110 s
->input_picture
[i
]->b_frame_score
=
1111 get_intra_count(s
, s
->input_picture
[i
]->data
[0],
1112 s
->input_picture
[i
-1]->data
[0], s
->linesize
) + 1;
1115 for(i
=0; i
<s
->max_b_frames
; i
++){
1116 if(s
->input_picture
[i
]->b_frame_score
- 1 > s
->mb_num
/40) break;
1119 b_frames
= FFMAX(0, i
-1);
1122 for(i
=0; i
<b_frames
+1; i
++){
1123 s
->input_picture
[i
]->b_frame_score
=0;
1126 fprintf(stderr
, "illegal b frame strategy\n");
1131 //static int b_count=0;
1132 //b_count+= b_frames;
1133 //printf("b_frames: %d\n", b_count);
1135 s
->reordered_input_picture
[0]= s
->input_picture
[b_frames
];
1136 if( s
->picture_in_gop_number
+ b_frames
>= s
->gop_size
1137 || s
->reordered_input_picture
[0]->pict_type
== I_TYPE
)
1138 s
->reordered_input_picture
[0]->pict_type
= I_TYPE
;
1140 s
->reordered_input_picture
[0]->pict_type
= P_TYPE
;
1141 s
->reordered_input_picture
[0]->coded_picture_number
= coded_pic_num
;
1142 for(i
=0; i
<b_frames
; i
++){
1144 s
->reordered_input_picture
[i
+1]= s
->input_picture
[i
];
1145 s
->reordered_input_picture
[i
+1]->pict_type
= B_TYPE
;
1146 s
->reordered_input_picture
[i
+1]->coded_picture_number
= coded_pic_num
;
1151 if(s
->reordered_input_picture
[0]){
1152 s
->reordered_input_picture
[0]->reference
= s
->reordered_input_picture
[0]->pict_type
!=B_TYPE
;
1154 if(s
->reordered_input_picture
[0]->type
== FF_BUFFER_TYPE_SHARED
){
1155 int i
= find_unused_picture(s
, 0);
1156 Picture
*pic
= &s
->picture
[i
];
1158 s
->new_picture
= *s
->reordered_input_picture
[0];
1160 /* mark us unused / free shared pic */
1162 s
->reordered_input_picture
[0]->data
[i
]= NULL
;
1163 s
->reordered_input_picture
[0]->type
= 0;
1165 pic
->pict_type
= s
->reordered_input_picture
[0]->pict_type
;
1166 pic
->quality
= s
->reordered_input_picture
[0]->quality
;
1167 pic
->coded_picture_number
= s
->reordered_input_picture
[0]->coded_picture_number
;
1168 pic
->reference
= s
->reordered_input_picture
[0]->reference
;
1170 alloc_picture(s
, pic
, 0);
1172 s
->current_picture
= *pic
;
1174 assert( s
->reordered_input_picture
[0]->type
==FF_BUFFER_TYPE_USER
1175 || s
->reordered_input_picture
[0]->type
==FF_BUFFER_TYPE_INTERNAL
);
1177 s
->new_picture
= *s
->reordered_input_picture
[0];
1180 s
->reordered_input_picture
[0]->data
[i
]-=16; //FIXME dirty
1182 s
->current_picture
= *s
->reordered_input_picture
[0];
1185 s
->picture_number
= s
->new_picture
.display_picture_number
;
1186 //printf("dpn:%d\n", s->picture_number);
1188 memset(&s
->new_picture
, 0, sizeof(Picture
));
1192 int MPV_encode_picture(AVCodecContext
*avctx
,
1193 unsigned char *buf
, int buf_size
, void *data
)
1195 MpegEncContext
*s
= avctx
->priv_data
;
1196 AVFrame
*pic_arg
= data
;
1199 init_put_bits(&s
->pb
, buf
, buf_size
, NULL
, NULL
);
1201 s
->picture_in_gop_number
++;
1203 load_input_picture(s
, pic_arg
);
1205 select_input_picture(s
);
1208 if(s
->new_picture
.data
[0]){
1210 s
->pict_type
= s
->new_picture
.pict_type
;
1211 if (s
->fixed_qscale
){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */
1212 s
->qscale
= (int)(s
->new_picture
.quality
+0.5);
1216 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
1217 MPV_frame_start(s
, avctx
);
1219 encode_picture(s
, s
->picture_number
);
1221 avctx
->real_pict_num
= s
->picture_number
;
1222 avctx
->header_bits
= s
->header_bits
;
1223 avctx
->mv_bits
= s
->mv_bits
;
1224 avctx
->misc_bits
= s
->misc_bits
;
1225 avctx
->i_tex_bits
= s
->i_tex_bits
;
1226 avctx
->p_tex_bits
= s
->p_tex_bits
;
1227 avctx
->i_count
= s
->i_count
;
1228 avctx
->p_count
= s
->mb_num
- s
->i_count
- s
->skip_count
; //FIXME f/b_count in avctx
1229 avctx
->skip_count
= s
->skip_count
;
1233 if (s
->out_format
== FMT_MJPEG
)
1234 mjpeg_picture_trailer(s
);
1236 if(s
->flags
&CODEC_FLAG_PASS1
)
1237 ff_write_pass1_stats(s
);
1240 s
->input_picture_number
++;
1242 flush_put_bits(&s
->pb
);
1243 s
->frame_bits
= (pbBufPtr(&s
->pb
) - s
->pb
.buf
) * 8;
1245 s
->total_bits
+= s
->frame_bits
;
1246 avctx
->frame_bits
= s
->frame_bits
;
1249 avctx
->error
[i
] += s
->current_picture
.error
[i
];
1252 return pbBufPtr(&s
->pb
) - s
->pb
.buf
;
1255 static inline void gmc1_motion(MpegEncContext
*s
,
1256 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
1258 UINT8
**ref_picture
, int src_offset
)
1261 int offset
, src_x
, src_y
, linesize
, uvlinesize
;
1262 int motion_x
, motion_y
;
1265 motion_x
= s
->sprite_offset
[0][0];
1266 motion_y
= s
->sprite_offset
[0][1];
1267 src_x
= s
->mb_x
* 16 + (motion_x
>> (s
->sprite_warping_accuracy
+1));
1268 src_y
= s
->mb_y
* 16 + (motion_y
>> (s
->sprite_warping_accuracy
+1));
1269 motion_x
<<=(3-s
->sprite_warping_accuracy
);
1270 motion_y
<<=(3-s
->sprite_warping_accuracy
);
1271 src_x
= clip(src_x
, -16, s
->width
);
1272 if (src_x
== s
->width
)
1274 src_y
= clip(src_y
, -16, s
->height
);
1275 if (src_y
== s
->height
)
1278 linesize
= s
->linesize
;
1279 uvlinesize
= s
->uvlinesize
;
1281 ptr
= ref_picture
[0] + (src_y
* linesize
) + src_x
+ src_offset
;
1283 dest_y
+=dest_offset
;
1284 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
1285 if(src_x
<0 || src_y
<0 || src_x
+ (motion_x
&15) + 16 > s
->h_edge_pos
1286 || src_y
+ (motion_y
&15) + 16 > s
->v_edge_pos
){
1287 emulated_edge_mc(s
, ptr
, linesize
, 17, 17, src_x
, src_y
, s
->h_edge_pos
, s
->v_edge_pos
);
1288 ptr
= s
->edge_emu_buffer
;
1293 if((motion_x
|motion_y
)&7){
1294 s
->dsp
.gmc1(dest_y
, ptr
, linesize
, 16, motion_x
&15, motion_y
&15, 128 - s
->no_rounding
);
1295 s
->dsp
.gmc1(dest_y
+8, ptr
+8, linesize
, 16, motion_x
&15, motion_y
&15, 128 - s
->no_rounding
);
1299 dxy
= ((motion_x
>>3)&1) | ((motion_y
>>2)&2);
1300 if (s
->no_rounding
){
1301 s
->dsp
.put_no_rnd_pixels_tab
[0][dxy
](dest_y
, ptr
, linesize
, 16);
1303 s
->dsp
.put_pixels_tab
[0][dxy
](dest_y
, ptr
, linesize
, 16);
1307 if(s
->flags
&CODEC_FLAG_GRAY
) return;
1309 motion_x
= s
->sprite_offset
[1][0];
1310 motion_y
= s
->sprite_offset
[1][1];
1311 src_x
= s
->mb_x
* 8 + (motion_x
>> (s
->sprite_warping_accuracy
+1));
1312 src_y
= s
->mb_y
* 8 + (motion_y
>> (s
->sprite_warping_accuracy
+1));
1313 motion_x
<<=(3-s
->sprite_warping_accuracy
);
1314 motion_y
<<=(3-s
->sprite_warping_accuracy
);
1315 src_x
= clip(src_x
, -8, s
->width
>>1);
1316 if (src_x
== s
->width
>>1)
1318 src_y
= clip(src_y
, -8, s
->height
>>1);
1319 if (src_y
== s
->height
>>1)
1322 offset
= (src_y
* uvlinesize
) + src_x
+ (src_offset
>>1);
1323 ptr
= ref_picture
[1] + offset
;
1325 emulated_edge_mc(s
, ptr
, uvlinesize
, 9, 9, src_x
, src_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1326 ptr
= s
->edge_emu_buffer
;
1328 s
->dsp
.gmc1(dest_cb
+ (dest_offset
>>1), ptr
, uvlinesize
, 8, motion_x
&15, motion_y
&15, 128 - s
->no_rounding
);
1330 ptr
= ref_picture
[2] + offset
;
1332 emulated_edge_mc(s
, ptr
, uvlinesize
, 9, 9, src_x
, src_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1333 ptr
= s
->edge_emu_buffer
;
1335 s
->dsp
.gmc1(dest_cr
+ (dest_offset
>>1), ptr
, uvlinesize
, 8, motion_x
&15, motion_y
&15, 128 - s
->no_rounding
);
1340 static inline void gmc_motion(MpegEncContext
*s
,
1341 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
1343 UINT8
**ref_picture
, int src_offset
)
1346 int linesize
, uvlinesize
;
1347 const int a
= s
->sprite_warping_accuracy
;
1350 linesize
= s
->linesize
;
1351 uvlinesize
= s
->uvlinesize
;
1353 ptr
= ref_picture
[0] + src_offset
;
1355 dest_y
+=dest_offset
;
1357 ox
= s
->sprite_offset
[0][0] + s
->sprite_delta
[0][0]*s
->mb_x
*16 + s
->sprite_delta
[0][1]*s
->mb_y
*16;
1358 oy
= s
->sprite_offset
[0][1] + s
->sprite_delta
[1][0]*s
->mb_x
*16 + s
->sprite_delta
[1][1]*s
->mb_y
*16;
1360 s
->dsp
.gmc(dest_y
, ptr
, linesize
, 16,
1363 s
->sprite_delta
[0][0], s
->sprite_delta
[0][1],
1364 s
->sprite_delta
[1][0], s
->sprite_delta
[1][1],
1365 a
+1, (1<<(2*a
+1)) - s
->no_rounding
,
1366 s
->h_edge_pos
, s
->v_edge_pos
);
1367 s
->dsp
.gmc(dest_y
+8, ptr
, linesize
, 16,
1368 ox
+ s
->sprite_delta
[0][0]*8,
1369 oy
+ s
->sprite_delta
[1][0]*8,
1370 s
->sprite_delta
[0][0], s
->sprite_delta
[0][1],
1371 s
->sprite_delta
[1][0], s
->sprite_delta
[1][1],
1372 a
+1, (1<<(2*a
+1)) - s
->no_rounding
,
1373 s
->h_edge_pos
, s
->v_edge_pos
);
1375 if(s
->flags
&CODEC_FLAG_GRAY
) return;
1378 dest_cb
+=dest_offset
>>1;
1379 dest_cr
+=dest_offset
>>1;
1381 ox
= s
->sprite_offset
[1][0] + s
->sprite_delta
[0][0]*s
->mb_x
*8 + s
->sprite_delta
[0][1]*s
->mb_y
*8;
1382 oy
= s
->sprite_offset
[1][1] + s
->sprite_delta
[1][0]*s
->mb_x
*8 + s
->sprite_delta
[1][1]*s
->mb_y
*8;
1384 ptr
= ref_picture
[1] + (src_offset
>>1);
1385 s
->dsp
.gmc(dest_cb
, ptr
, uvlinesize
, 8,
1388 s
->sprite_delta
[0][0], s
->sprite_delta
[0][1],
1389 s
->sprite_delta
[1][0], s
->sprite_delta
[1][1],
1390 a
+1, (1<<(2*a
+1)) - s
->no_rounding
,
1391 s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1393 ptr
= ref_picture
[2] + (src_offset
>>1);
1394 s
->dsp
.gmc(dest_cr
, ptr
, uvlinesize
, 8,
1397 s
->sprite_delta
[0][0], s
->sprite_delta
[0][1],
1398 s
->sprite_delta
[1][0], s
->sprite_delta
[1][1],
1399 a
+1, (1<<(2*a
+1)) - s
->no_rounding
,
1400 s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1404 static void emulated_edge_mc(MpegEncContext
*s
, UINT8
*src
, int linesize
, int block_w
, int block_h
,
1405 int src_x
, int src_y
, int w
, int h
){
1407 int start_y
, start_x
, end_y
, end_x
;
1408 UINT8
*buf
= s
->edge_emu_buffer
;
1411 src
+= (h
-1-src_y
)*linesize
;
1413 }else if(src_y
<=-block_h
){
1414 src
+= (1-block_h
-src_y
)*linesize
;
1420 }else if(src_x
<=-block_w
){
1421 src
+= (1-block_w
-src_x
);
1425 start_y
= FFMAX(0, -src_y
);
1426 start_x
= FFMAX(0, -src_x
);
1427 end_y
= FFMIN(block_h
, h
-src_y
);
1428 end_x
= FFMIN(block_w
, w
-src_x
);
1430 // copy existing part
1431 for(y
=start_y
; y
<end_y
; y
++){
1432 for(x
=start_x
; x
<end_x
; x
++){
1433 buf
[x
+ y
*linesize
]= src
[x
+ y
*linesize
];
1438 for(y
=0; y
<start_y
; y
++){
1439 for(x
=start_x
; x
<end_x
; x
++){
1440 buf
[x
+ y
*linesize
]= buf
[x
+ start_y
*linesize
];
1445 for(y
=end_y
; y
<block_h
; y
++){
1446 for(x
=start_x
; x
<end_x
; x
++){
1447 buf
[x
+ y
*linesize
]= buf
[x
+ (end_y
-1)*linesize
];
1451 for(y
=0; y
<block_h
; y
++){
1453 for(x
=0; x
<start_x
; x
++){
1454 buf
[x
+ y
*linesize
]= buf
[start_x
+ y
*linesize
];
1458 for(x
=end_x
; x
<block_w
; x
++){
1459 buf
[x
+ y
*linesize
]= buf
[end_x
- 1 + y
*linesize
];
1465 /* apply one mpeg motion vector to the three components */
1466 static inline void mpeg_motion(MpegEncContext
*s
,
1467 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
1469 UINT8
**ref_picture
, int src_offset
,
1470 int field_based
, op_pixels_func (*pix_op
)[4],
1471 int motion_x
, int motion_y
, int h
)
1474 int dxy
, offset
, mx
, my
, src_x
, src_y
, height
, v_edge_pos
, linesize
, uvlinesize
;
1477 if(s
->quarter_sample
)
1483 dxy
= ((motion_y
& 1) << 1) | (motion_x
& 1);
1484 src_x
= s
->mb_x
* 16 + (motion_x
>> 1);
1485 src_y
= s
->mb_y
* (16 >> field_based
) + (motion_y
>> 1);
1487 /* WARNING: do no forget half pels */
1488 height
= s
->height
>> field_based
;
1489 v_edge_pos
= s
->v_edge_pos
>> field_based
;
1490 src_x
= clip(src_x
, -16, s
->width
);
1491 if (src_x
== s
->width
)
1493 src_y
= clip(src_y
, -16, height
);
1494 if (src_y
== height
)
1496 linesize
= s
->linesize
<< field_based
;
1497 uvlinesize
= s
->uvlinesize
<< field_based
;
1498 ptr
= ref_picture
[0] + (src_y
* linesize
) + (src_x
) + src_offset
;
1499 dest_y
+= dest_offset
;
1501 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
1502 if(src_x
<0 || src_y
<0 || src_x
+ (motion_x
&1) + 16 > s
->h_edge_pos
1503 || src_y
+ (motion_y
&1) + h
> v_edge_pos
){
1504 emulated_edge_mc(s
, ptr
- src_offset
, s
->linesize
, 17, 17+field_based
,
1505 src_x
, src_y
<<field_based
, s
->h_edge_pos
, s
->v_edge_pos
);
1506 ptr
= s
->edge_emu_buffer
+ src_offset
;
1510 pix_op
[0][dxy
](dest_y
, ptr
, linesize
, h
);
1512 if(s
->flags
&CODEC_FLAG_GRAY
) return;
1514 if (s
->out_format
== FMT_H263
) {
1516 if ((motion_x
& 3) != 0)
1518 if ((motion_y
& 3) != 0)
1525 dxy
= ((my
& 1) << 1) | (mx
& 1);
1530 src_x
= s
->mb_x
* 8 + mx
;
1531 src_y
= s
->mb_y
* (8 >> field_based
) + my
;
1532 src_x
= clip(src_x
, -8, s
->width
>> 1);
1533 if (src_x
== (s
->width
>> 1))
1535 src_y
= clip(src_y
, -8, height
>> 1);
1536 if (src_y
== (height
>> 1))
1538 offset
= (src_y
* uvlinesize
) + src_x
+ (src_offset
>> 1);
1539 ptr
= ref_picture
[1] + offset
;
1541 emulated_edge_mc(s
, ptr
- (src_offset
>> 1), s
->uvlinesize
, 9, 9+field_based
,
1542 src_x
, src_y
<<field_based
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1543 ptr
= s
->edge_emu_buffer
+ (src_offset
>> 1);
1545 pix_op
[1][dxy
](dest_cb
+ (dest_offset
>> 1), ptr
, uvlinesize
, h
>> 1);
1547 ptr
= ref_picture
[2] + offset
;
1549 emulated_edge_mc(s
, ptr
- (src_offset
>> 1), s
->uvlinesize
, 9, 9+field_based
,
1550 src_x
, src_y
<<field_based
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1551 ptr
= s
->edge_emu_buffer
+ (src_offset
>> 1);
1553 pix_op
[1][dxy
](dest_cr
+ (dest_offset
>> 1), ptr
, uvlinesize
, h
>> 1);
1556 static inline void qpel_motion(MpegEncContext
*s
,
1557 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
1559 UINT8
**ref_picture
, int src_offset
,
1560 int field_based
, op_pixels_func (*pix_op
)[4],
1561 qpel_mc_func (*qpix_op
)[16],
1562 int motion_x
, int motion_y
, int h
)
1565 int dxy
, offset
, mx
, my
, src_x
, src_y
, height
, v_edge_pos
, linesize
, uvlinesize
;
1568 dxy
= ((motion_y
& 3) << 2) | (motion_x
& 3);
1569 src_x
= s
->mb_x
* 16 + (motion_x
>> 2);
1570 src_y
= s
->mb_y
* (16 >> field_based
) + (motion_y
>> 2);
1572 height
= s
->height
>> field_based
;
1573 v_edge_pos
= s
->v_edge_pos
>> field_based
;
1574 src_x
= clip(src_x
, -16, s
->width
);
1575 if (src_x
== s
->width
)
1577 src_y
= clip(src_y
, -16, height
);
1578 if (src_y
== height
)
1580 linesize
= s
->linesize
<< field_based
;
1581 uvlinesize
= s
->uvlinesize
<< field_based
;
1582 ptr
= ref_picture
[0] + (src_y
* linesize
) + src_x
+ src_offset
;
1583 dest_y
+= dest_offset
;
1584 //printf("%d %d %d\n", src_x, src_y, dxy);
1586 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
1587 if(src_x
<0 || src_y
<0 || src_x
+ (motion_x
&3) + 16 > s
->h_edge_pos
1588 || src_y
+ (motion_y
&3) + h
> v_edge_pos
){
1589 emulated_edge_mc(s
, ptr
- src_offset
, s
->linesize
, 17, 17+field_based
,
1590 src_x
, src_y
<<field_based
, s
->h_edge_pos
, s
->v_edge_pos
);
1591 ptr
= s
->edge_emu_buffer
+ src_offset
;
1596 qpix_op
[0][dxy
](dest_y
, ptr
, linesize
);
1598 //damn interlaced mode
1599 //FIXME boundary mirroring is not exactly correct here
1600 qpix_op
[1][dxy
](dest_y
, ptr
, linesize
);
1601 qpix_op
[1][dxy
](dest_y
+8, ptr
+8, linesize
);
1604 if(s
->flags
&CODEC_FLAG_GRAY
) return;
1609 }else if(s
->workaround_bugs
&FF_BUG_QPEL_CHROMA
){
1610 mx
= (motion_x
>>1)|(motion_x
&1);
1611 my
= (motion_y
>>1)|(motion_y
&1);
1618 dxy
= (mx
&1) | ((my
&1)<<1);
1622 src_x
= s
->mb_x
* 8 + mx
;
1623 src_y
= s
->mb_y
* (8 >> field_based
) + my
;
1624 src_x
= clip(src_x
, -8, s
->width
>> 1);
1625 if (src_x
== (s
->width
>> 1))
1627 src_y
= clip(src_y
, -8, height
>> 1);
1628 if (src_y
== (height
>> 1))
1631 offset
= (src_y
* uvlinesize
) + src_x
+ (src_offset
>> 1);
1632 ptr
= ref_picture
[1] + offset
;
1634 emulated_edge_mc(s
, ptr
- (src_offset
>> 1), s
->uvlinesize
, 9, 9 + field_based
,
1635 src_x
, src_y
<<field_based
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1636 ptr
= s
->edge_emu_buffer
+ (src_offset
>> 1);
1638 pix_op
[1][dxy
](dest_cb
+ (dest_offset
>> 1), ptr
, uvlinesize
, h
>> 1);
1640 ptr
= ref_picture
[2] + offset
;
1642 emulated_edge_mc(s
, ptr
- (src_offset
>> 1), s
->uvlinesize
, 9, 9 + field_based
,
1643 src_x
, src_y
<<field_based
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1644 ptr
= s
->edge_emu_buffer
+ (src_offset
>> 1);
1646 pix_op
[1][dxy
](dest_cr
+ (dest_offset
>> 1), ptr
, uvlinesize
, h
>> 1);
1650 static inline void MPV_motion(MpegEncContext
*s
,
1651 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
1652 int dir
, UINT8
**ref_picture
,
1653 op_pixels_func (*pix_op
)[4], qpel_mc_func (*qpix_op
)[16])
1655 int dxy
, offset
, mx
, my
, src_x
, src_y
, motion_x
, motion_y
;
1663 switch(s
->mv_type
) {
1666 if(s
->real_sprite_warping_points
==1){
1667 gmc1_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1670 gmc_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1673 }else if(s
->quarter_sample
){
1674 qpel_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1677 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 16);
1679 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1682 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 16);
1688 if(s
->quarter_sample
){
1690 motion_x
= s
->mv
[dir
][i
][0];
1691 motion_y
= s
->mv
[dir
][i
][1];
1693 dxy
= ((motion_y
& 3) << 2) | (motion_x
& 3);
1694 src_x
= mb_x
* 16 + (motion_x
>> 2) + (i
& 1) * 8;
1695 src_y
= mb_y
* 16 + (motion_y
>> 2) + (i
>>1) * 8;
1697 /* WARNING: do no forget half pels */
1698 src_x
= clip(src_x
, -16, s
->width
);
1699 if (src_x
== s
->width
)
1701 src_y
= clip(src_y
, -16, s
->height
);
1702 if (src_y
== s
->height
)
1705 ptr
= ref_picture
[0] + (src_y
* s
->linesize
) + (src_x
);
1706 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
1707 if(src_x
<0 || src_y
<0 || src_x
+ (motion_x
&3) + 8 > s
->h_edge_pos
1708 || src_y
+ (motion_y
&3) + 8 > s
->v_edge_pos
){
1709 emulated_edge_mc(s
, ptr
, s
->linesize
, 9, 9, src_x
, src_y
, s
->h_edge_pos
, s
->v_edge_pos
);
1710 ptr
= s
->edge_emu_buffer
;
1713 dest
= dest_y
+ ((i
& 1) * 8) + (i
>> 1) * 8 * s
->linesize
;
1714 qpix_op
[1][dxy
](dest
, ptr
, s
->linesize
);
1716 mx
+= s
->mv
[dir
][i
][0]/2;
1717 my
+= s
->mv
[dir
][i
][1]/2;
1721 motion_x
= s
->mv
[dir
][i
][0];
1722 motion_y
= s
->mv
[dir
][i
][1];
1724 dxy
= ((motion_y
& 1) << 1) | (motion_x
& 1);
1725 src_x
= mb_x
* 16 + (motion_x
>> 1) + (i
& 1) * 8;
1726 src_y
= mb_y
* 16 + (motion_y
>> 1) + (i
>>1) * 8;
1728 /* WARNING: do no forget half pels */
1729 src_x
= clip(src_x
, -16, s
->width
);
1730 if (src_x
== s
->width
)
1732 src_y
= clip(src_y
, -16, s
->height
);
1733 if (src_y
== s
->height
)
1736 ptr
= ref_picture
[0] + (src_y
* s
->linesize
) + (src_x
);
1737 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
1738 if(src_x
<0 || src_y
<0 || src_x
+ (motion_x
&1) + 8 > s
->h_edge_pos
1739 || src_y
+ (motion_y
&1) + 8 > s
->v_edge_pos
){
1740 emulated_edge_mc(s
, ptr
, s
->linesize
, 9, 9, src_x
, src_y
, s
->h_edge_pos
, s
->v_edge_pos
);
1741 ptr
= s
->edge_emu_buffer
;
1744 dest
= dest_y
+ ((i
& 1) * 8) + (i
>> 1) * 8 * s
->linesize
;
1745 pix_op
[1][dxy
](dest
, ptr
, s
->linesize
, 8);
1747 mx
+= s
->mv
[dir
][i
][0];
1748 my
+= s
->mv
[dir
][i
][1];
1752 if(s
->flags
&CODEC_FLAG_GRAY
) break;
1753 /* In case of 8X8, we construct a single chroma motion vector
1754 with a special rounding */
1758 mx
= (h263_chroma_roundtab
[mx
& 0xf] + ((mx
>> 3) & ~1));
1761 mx
= -(h263_chroma_roundtab
[mx
& 0xf] + ((mx
>> 3) & ~1));
1764 my
= (h263_chroma_roundtab
[my
& 0xf] + ((my
>> 3) & ~1));
1767 my
= -(h263_chroma_roundtab
[my
& 0xf] + ((my
>> 3) & ~1));
1769 dxy
= ((my
& 1) << 1) | (mx
& 1);
1773 src_x
= mb_x
* 8 + mx
;
1774 src_y
= mb_y
* 8 + my
;
1775 src_x
= clip(src_x
, -8, s
->width
/2);
1776 if (src_x
== s
->width
/2)
1778 src_y
= clip(src_y
, -8, s
->height
/2);
1779 if (src_y
== s
->height
/2)
1782 offset
= (src_y
* (s
->uvlinesize
)) + src_x
;
1783 ptr
= ref_picture
[1] + offset
;
1784 if(s
->flags
&CODEC_FLAG_EMU_EDGE
){
1785 if(src_x
<0 || src_y
<0 || src_x
+ (dxy
&1) + 8 > s
->h_edge_pos
>>1
1786 || src_y
+ (dxy
>>1) + 8 > s
->v_edge_pos
>>1){
1787 emulated_edge_mc(s
, ptr
, s
->uvlinesize
, 9, 9, src_x
, src_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1788 ptr
= s
->edge_emu_buffer
;
1792 pix_op
[1][dxy
](dest_cb
, ptr
, s
->uvlinesize
, 8);
1794 ptr
= ref_picture
[2] + offset
;
1796 emulated_edge_mc(s
, ptr
, s
->uvlinesize
, 9, 9, src_x
, src_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
1797 ptr
= s
->edge_emu_buffer
;
1799 pix_op
[1][dxy
](dest_cr
, ptr
, s
->uvlinesize
, 8);
1802 if (s
->picture_structure
== PICT_FRAME
) {
1803 if(s
->quarter_sample
){
1805 qpel_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1806 ref_picture
, s
->field_select
[dir
][0] ? s
->linesize
: 0,
1808 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 8);
1810 qpel_motion(s
, dest_y
, dest_cb
, dest_cr
, s
->linesize
,
1811 ref_picture
, s
->field_select
[dir
][1] ? s
->linesize
: 0,
1813 s
->mv
[dir
][1][0], s
->mv
[dir
][1][1], 8);
1816 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1817 ref_picture
, s
->field_select
[dir
][0] ? s
->linesize
: 0,
1819 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 8);
1821 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, s
->linesize
,
1822 ref_picture
, s
->field_select
[dir
][1] ? s
->linesize
: 0,
1824 s
->mv
[dir
][1][0], s
->mv
[dir
][1][1], 8);
1835 /* put block[] to dest[] */
1836 static inline void put_dct(MpegEncContext
*s
,
1837 DCTELEM
*block
, int i
, UINT8
*dest
, int line_size
)
1839 s
->dct_unquantize(s
, block
, i
, s
->qscale
);
1840 s
->idct_put (dest
, line_size
, block
);
1843 /* add block[] to dest[] */
1844 static inline void add_dct(MpegEncContext
*s
,
1845 DCTELEM
*block
, int i
, UINT8
*dest
, int line_size
)
1847 if (s
->block_last_index
[i
] >= 0) {
1848 s
->idct_add (dest
, line_size
, block
);
1852 static inline void add_dequant_dct(MpegEncContext
*s
,
1853 DCTELEM
*block
, int i
, UINT8
*dest
, int line_size
)
1855 if (s
->block_last_index
[i
] >= 0) {
1856 s
->dct_unquantize(s
, block
, i
, s
->qscale
);
1858 s
->idct_add (dest
, line_size
, block
);
1863 * cleans dc, ac, coded_block for the current non intra MB
1865 void ff_clean_intra_table_entries(MpegEncContext
*s
)
1867 int wrap
= s
->block_wrap
[0];
1868 int xy
= s
->block_index
[0];
1871 s
->dc_val
[0][xy
+ 1 ] =
1872 s
->dc_val
[0][xy
+ wrap
] =
1873 s
->dc_val
[0][xy
+ 1 + wrap
] = 1024;
1875 memset(s
->ac_val
[0][xy
], 0, 32 * sizeof(INT16
));
1876 memset(s
->ac_val
[0][xy
+ wrap
], 0, 32 * sizeof(INT16
));
1877 if (s
->msmpeg4_version
>=3) {
1878 s
->coded_block
[xy
] =
1879 s
->coded_block
[xy
+ 1 ] =
1880 s
->coded_block
[xy
+ wrap
] =
1881 s
->coded_block
[xy
+ 1 + wrap
] = 0;
1884 wrap
= s
->block_wrap
[4];
1885 xy
= s
->mb_x
+ 1 + (s
->mb_y
+ 1) * wrap
;
1887 s
->dc_val
[2][xy
] = 1024;
1889 memset(s
->ac_val
[1][xy
], 0, 16 * sizeof(INT16
));
1890 memset(s
->ac_val
[2][xy
], 0, 16 * sizeof(INT16
));
1892 s
->mbintra_table
[s
->mb_x
+ s
->mb_y
*s
->mb_width
]= 0;
1895 /* generic function called after a macroblock has been parsed by the
1896 decoder or after it has been encoded by the encoder.
1898 Important variables used:
1899 s->mb_intra : true if intra macroblock
1900 s->mv_dir : motion vector direction
1901 s->mv_type : motion vector type
1902 s->mv : motion vector
1903 s->interlaced_dct : true if interlaced dct used (mpeg2)
1905 void MPV_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1908 const int mb_xy
= s
->mb_y
* s
->mb_width
+ s
->mb_x
;
1913 s
->current_picture
.qscale_table
[mb_xy
]= s
->qscale
;
1915 /* update DC predictors for P macroblocks */
1917 if (s
->h263_pred
|| s
->h263_aic
) {
1918 if(s
->mbintra_table
[mb_xy
])
1919 ff_clean_intra_table_entries(s
);
1923 s
->last_dc
[2] = 128 << s
->intra_dc_precision
;
1926 else if (s
->h263_pred
|| s
->h263_aic
)
1927 s
->mbintra_table
[mb_xy
]=1;
1929 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
1930 if (s
->out_format
== FMT_H263
&& s
->pict_type
!=B_TYPE
) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
1932 const int wrap
= s
->block_wrap
[0];
1933 const int xy
= s
->block_index
[0];
1934 const int mb_index
= s
->mb_x
+ s
->mb_y
*s
->mb_width
;
1935 if(s
->mv_type
== MV_TYPE_8X8
){
1936 s
->co_located_type_table
[mb_index
]= CO_LOCATED_TYPE_4MV
;
1938 int motion_x
, motion_y
;
1942 if(s
->co_located_type_table
)
1943 s
->co_located_type_table
[mb_index
]= 0;
1944 } else if (s
->mv_type
== MV_TYPE_16X16
) {
1945 motion_x
= s
->mv
[0][0][0];
1946 motion_y
= s
->mv
[0][0][1];
1947 if(s
->co_located_type_table
)
1948 s
->co_located_type_table
[mb_index
]= 0;
1949 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
1951 motion_x
= s
->mv
[0][0][0] + s
->mv
[0][1][0];
1952 motion_y
= s
->mv
[0][0][1] + s
->mv
[0][1][1];
1953 motion_x
= (motion_x
>>1) | (motion_x
&1);
1955 s
->field_mv_table
[mb_index
][i
][0]= s
->mv
[0][i
][0];
1956 s
->field_mv_table
[mb_index
][i
][1]= s
->mv
[0][i
][1];
1957 s
->field_select_table
[mb_index
][i
]= s
->field_select
[0][i
];
1959 s
->co_located_type_table
[mb_index
]= CO_LOCATED_TYPE_FIELDMV
;
1961 /* no update if 8X8 because it has been done during parsing */
1962 s
->motion_val
[xy
][0] = motion_x
;
1963 s
->motion_val
[xy
][1] = motion_y
;
1964 s
->motion_val
[xy
+ 1][0] = motion_x
;
1965 s
->motion_val
[xy
+ 1][1] = motion_y
;
1966 s
->motion_val
[xy
+ wrap
][0] = motion_x
;
1967 s
->motion_val
[xy
+ wrap
][1] = motion_y
;
1968 s
->motion_val
[xy
+ 1 + wrap
][0] = motion_x
;
1969 s
->motion_val
[xy
+ 1 + wrap
][1] = motion_y
;
1973 if ((s
->flags
&CODEC_FLAG_PSNR
) || !(s
->encoding
&& (s
->intra_only
|| s
->pict_type
==B_TYPE
))) { //FIXME precalc
1974 UINT8
*dest_y
, *dest_cb
, *dest_cr
;
1975 int dct_linesize
, dct_offset
;
1976 op_pixels_func (*op_pix
)[4];
1977 qpel_mc_func (*op_qpix
)[16];
1979 /* avoid copy if macroblock skipped in last frame too */
1980 if (s
->pict_type
!= B_TYPE
) {
1981 s
->current_picture
.mbskip_table
[mb_xy
]= s
->mb_skiped
;
1984 /* skip only during decoding as we might trash the buffers during encoding a bit */
1986 UINT8
*mbskip_ptr
= &s
->mbskip_table
[mb_xy
];
1987 const int age
= s
->current_picture
.age
;
1993 assert(s
->pict_type
!=I_TYPE
);
1995 (*mbskip_ptr
) ++; /* indicate that this time we skiped it */
1996 if(*mbskip_ptr
>99) *mbskip_ptr
= 99;
1998 /* if previous was skipped too, then nothing to do ! */
1999 if (*mbskip_ptr
>= age
){
2000 //if(s->pict_type!=B_TYPE && s->mb_x==0) printf("\n");
2001 //if(s->pict_type!=B_TYPE) printf("%d%d ", *mbskip_ptr, age);
2002 if(s
->pict_type
!=B_TYPE
) return;
2003 if(s
->avctx
->draw_horiz_band
==NULL
&& *mbskip_ptr
> age
) return;
2004 /* we dont draw complete frames here so we cant skip */
2007 *mbskip_ptr
= 0; /* not skipped */
2012 if(s
->pict_type
==B_TYPE
&& s
->avctx
->draw_horiz_band
){
2013 dest_y
= s
->current_picture
.data
[0] + mb_x
* 16;
2014 dest_cb
= s
->current_picture
.data
[1] + mb_x
* 8;
2015 dest_cr
= s
->current_picture
.data
[2] + mb_x
* 8;
2017 dest_y
= s
->current_picture
.data
[0] + (mb_y
* 16* s
->linesize
) + mb_x
* 16;
2018 dest_cb
= s
->current_picture
.data
[1] + (mb_y
* 8 * s
->uvlinesize
) + mb_x
* 8;
2019 dest_cr
= s
->current_picture
.data
[2] + (mb_y
* 8 * s
->uvlinesize
) + mb_x
* 8;
2022 if (s
->interlaced_dct
) {
2023 dct_linesize
= s
->linesize
* 2;
2024 dct_offset
= s
->linesize
;
2026 dct_linesize
= s
->linesize
;
2027 dct_offset
= s
->linesize
* 8;
2031 /* motion handling */
2032 /* decoding or more than one mb_type (MC was allready done otherwise) */
2033 if((!s
->encoding
) || (s
->mb_type
[mb_xy
]&(s
->mb_type
[mb_xy
]-1))){
2034 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
){
2035 op_pix
= s
->dsp
.put_pixels_tab
;
2036 op_qpix
= s
->dsp
.put_qpel_pixels_tab
;
2038 op_pix
= s
->dsp
.put_no_rnd_pixels_tab
;
2039 op_qpix
= s
->dsp
.put_no_rnd_qpel_pixels_tab
;
2042 if (s
->mv_dir
& MV_DIR_FORWARD
) {
2043 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 0, s
->last_picture
.data
, op_pix
, op_qpix
);
2044 op_pix
= s
->dsp
.avg_pixels_tab
;
2045 op_qpix
= s
->dsp
.avg_qpel_pixels_tab
;
2047 if (s
->mv_dir
& MV_DIR_BACKWARD
) {
2048 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 1, s
->next_picture
.data
, op_pix
, op_qpix
);
2052 /* skip dequant / idct if we are really late ;) */
2053 if(s
->hurry_up
>1) return;
2055 /* add dct residue */
2056 if(s
->encoding
|| !( s
->mpeg2
|| s
->h263_msmpeg4
|| s
->codec_id
==CODEC_ID_MPEG1VIDEO
2057 || (s
->codec_id
==CODEC_ID_MPEG4
&& !s
->mpeg_quant
))){
2058 add_dequant_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
2059 add_dequant_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
2060 add_dequant_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
2061 add_dequant_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
2063 if(!(s
->flags
&CODEC_FLAG_GRAY
)){
2064 add_dequant_dct(s
, block
[4], 4, dest_cb
, s
->uvlinesize
);
2065 add_dequant_dct(s
, block
[5], 5, dest_cr
, s
->uvlinesize
);
2068 add_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
2069 add_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
2070 add_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
2071 add_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
2073 if(!(s
->flags
&CODEC_FLAG_GRAY
)){
2074 add_dct(s
, block
[4], 4, dest_cb
, s
->uvlinesize
);
2075 add_dct(s
, block
[5], 5, dest_cr
, s
->uvlinesize
);
2079 /* dct only in intra block */
2080 if(s
->encoding
|| !(s
->mpeg2
|| s
->codec_id
==CODEC_ID_MPEG1VIDEO
)){
2081 put_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
2082 put_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
2083 put_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
2084 put_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
2086 if(!(s
->flags
&CODEC_FLAG_GRAY
)){
2087 put_dct(s
, block
[4], 4, dest_cb
, s
->uvlinesize
);
2088 put_dct(s
, block
[5], 5, dest_cr
, s
->uvlinesize
);
2091 s
->idct_put(dest_y
, dct_linesize
, block
[0]);
2092 s
->idct_put(dest_y
+ 8, dct_linesize
, block
[1]);
2093 s
->idct_put(dest_y
+ dct_offset
, dct_linesize
, block
[2]);
2094 s
->idct_put(dest_y
+ dct_offset
+ 8, dct_linesize
, block
[3]);
2096 if(!(s
->flags
&CODEC_FLAG_GRAY
)){
2097 s
->idct_put(dest_cb
, s
->uvlinesize
, block
[4]);
2098 s
->idct_put(dest_cr
, s
->uvlinesize
, block
[5]);
2105 static inline void dct_single_coeff_elimination(MpegEncContext
*s
, int n
, int threshold
)
2107 static const char tab
[64]=
2119 DCTELEM
*block
= s
->block
[n
];
2120 const int last_index
= s
->block_last_index
[n
];
2125 threshold
= -threshold
;
2129 /* are all which we could set to zero are allready zero? */
2130 if(last_index
<=skip_dc
- 1) return;
2132 for(i
=0; i
<=last_index
; i
++){
2133 const int j
= s
->intra_scantable
.permutated
[i
];
2134 const int level
= ABS(block
[j
]);
2136 if(skip_dc
&& i
==0) continue;
2145 if(score
>= threshold
) return;
2146 for(i
=skip_dc
; i
<=last_index
; i
++){
2147 const int j
= s
->intra_scantable
.permutated
[i
];
2150 if(block
[0]) s
->block_last_index
[n
]= 0;
2151 else s
->block_last_index
[n
]= -1;
2154 static inline void clip_coeffs(MpegEncContext
*s
, DCTELEM
*block
, int last_index
)
2157 const int maxlevel
= s
->max_qcoeff
;
2158 const int minlevel
= s
->min_qcoeff
;
2161 i
=1; //skip clipping of intra dc
2165 for(;i
<=last_index
; i
++){
2166 const int j
= s
->intra_scantable
.permutated
[i
];
2167 int level
= block
[j
];
2169 if (level
>maxlevel
) level
=maxlevel
;
2170 else if(level
<minlevel
) level
=minlevel
;
2175 static inline void requantize_coeffs(MpegEncContext
*s
, DCTELEM block
[64], int oldq
, int newq
, int n
)
2180 i
=1; //skip clipping of intra dc
2181 //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...)
2185 for(;i
<=s
->block_last_index
[n
]; i
++){
2186 const int j
= s
->intra_scantable
.permutated
[i
];
2187 int level
= block
[j
];
2189 block
[j
]= ROUNDED_DIV(level
*oldq
, newq
);
2192 for(i
=s
->block_last_index
[n
]; i
>=0; i
--){
2193 const int j
= s
->intra_scantable
.permutated
[i
];
2196 s
->block_last_index
[n
]= i
;
2199 static inline void auto_requantize_coeffs(MpegEncContext
*s
, DCTELEM block
[6][64])
2202 const int maxlevel
= s
->max_qcoeff
;
2203 const int minlevel
= s
->min_qcoeff
;
2204 int largest
=0, smallest
=0;
2206 assert(s
->adaptive_quant
);
2210 i
=1; //skip clipping of intra dc
2211 //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...)
2215 for(;i
<=s
->block_last_index
[n
]; i
++){
2216 const int j
= s
->intra_scantable
.permutated
[i
];
2217 int level
= block
[n
][j
];
2218 if(largest
< level
) largest
= level
;
2219 if(smallest
> level
) smallest
= level
;
2223 for(newq
=s
->qscale
+1; newq
<32; newq
++){
2224 if( ROUNDED_DIV(smallest
*s
->qscale
, newq
) >= minlevel
2225 && ROUNDED_DIV(largest
*s
->qscale
, newq
) <= maxlevel
)
2229 if(s
->out_format
==FMT_H263
){
2230 /* h263 like formats cannot change qscale by more than 2 easiely */
2231 if(s
->avctx
->qmin
+ 2 < newq
)
2232 newq
= s
->avctx
->qmin
+ 2;
2236 requantize_coeffs(s
, block
[n
], s
->qscale
, newq
, n
);
2237 clip_coeffs(s
, block
[n
], s
->block_last_index
[n
]);
2240 s
->dquant
+= newq
- s
->qscale
;
2244 static int pix_vcmp16x8(UINT8
*s
, int stride
){ //FIXME move to dsputil & optimize
2249 for(x
=0; x
<16; x
+=4){
2250 score
+= ABS(s
[x
] - s
[x
+stride
]) + ABS(s
[x
+1] - s
[x
+1+stride
])
2251 +ABS(s
[x
+2] - s
[x
+2+stride
]) + ABS(s
[x
+3] - s
[x
+3+stride
]);
2259 static int pix_diff_vcmp16x8(UINT8
*s1
, UINT8
*s2
, int stride
){ //FIXME move to dsputil & optimize
2264 for(x
=0; x
<16; x
++){
2265 score
+= ABS(s1
[x
] - s2
[x
] - s1
[x
+stride
] + s2
[x
+stride
]);
2274 #define SQ(a) ((a)*(a))
2276 static int pix_vcmp16x8(UINT8
*s
, int stride
){ //FIXME move to dsputil & optimize
2281 for(x
=0; x
<16; x
+=4){
2282 score
+= SQ(s
[x
] - s
[x
+stride
]) + SQ(s
[x
+1] - s
[x
+1+stride
])
2283 +SQ(s
[x
+2] - s
[x
+2+stride
]) + SQ(s
[x
+3] - s
[x
+3+stride
]);
2291 static int pix_diff_vcmp16x8(UINT8
*s1
, UINT8
*s2
, int stride
){ //FIXME move to dsputil & optimize
2296 for(x
=0; x
<16; x
++){
2297 score
+= SQ(s1
[x
] - s2
[x
] - s1
[x
+stride
] + s2
[x
+stride
]);
2308 void ff_draw_horiz_band(MpegEncContext
*s
){
2309 if ( s
->avctx
->draw_horiz_band
2310 && (s
->last_picture
.data
[0] || s
->low_delay
) ) {
2318 if(s
->pict_type
==B_TYPE
)
2321 offset
= y
* s
->linesize
;
2323 if(s
->pict_type
==B_TYPE
|| s
->low_delay
){
2324 src_ptr
[0] = s
->current_picture
.data
[0] + offset
;
2325 src_ptr
[1] = s
->current_picture
.data
[1] + (offset
>> 2);
2326 src_ptr
[2] = s
->current_picture
.data
[2] + (offset
>> 2);
2328 src_ptr
[0] = s
->last_picture
.data
[0] + offset
;
2329 src_ptr
[1] = s
->last_picture
.data
[1] + (offset
>> 2);
2330 src_ptr
[2] = s
->last_picture
.data
[2] + (offset
>> 2);
2334 s
->avctx
->draw_horiz_band(s
->avctx
, src_ptr
, s
->linesize
,
2339 static void encode_mb(MpegEncContext
*s
, int motion_x
, int motion_y
)
2341 const int mb_x
= s
->mb_x
;
2342 const int mb_y
= s
->mb_y
;
2345 int dct_offset
= s
->linesize
*8; //default for progressive frames
2347 for(i
=0; i
<6; i
++) skip_dct
[i
]=0;
2349 if(s
->adaptive_quant
){
2350 s
->dquant
= s
->current_picture
.qscale_table
[mb_x
+ mb_y
*s
->mb_width
] - s
->qscale
;
2352 if(s
->out_format
==FMT_H263
){
2353 if (s
->dquant
> 2) s
->dquant
= 2;
2354 else if(s
->dquant
<-2) s
->dquant
=-2;
2357 if(s
->codec_id
==CODEC_ID_MPEG4
){
2359 assert(s
->dquant
==0 || s
->mv_type
!=MV_TYPE_8X8
);
2361 if(s
->mv_dir
&MV_DIRECT
)
2365 s
->qscale
+= s
->dquant
;
2366 s
->y_dc_scale
= s
->y_dc_scale_table
[ s
->qscale
];
2367 s
->c_dc_scale
= s
->c_dc_scale_table
[ s
->qscale
];
2375 wrap_y
= s
->linesize
;
2376 ptr
= s
->new_picture
.data
[0] + (mb_y
* 16 * wrap_y
) + mb_x
* 16;
2378 if(mb_x
*16+16 > s
->width
|| mb_y
*16+16 > s
->height
){
2379 emulated_edge_mc(s
, ptr
, wrap_y
, 16, 16, mb_x
*16, mb_y
*16, s
->width
, s
->height
);
2380 ptr
= s
->edge_emu_buffer
;
2384 if(s
->flags
&CODEC_FLAG_INTERLACED_DCT
){
2385 int progressive_score
, interlaced_score
;
2387 progressive_score
= pix_vcmp16x8(ptr
, wrap_y
) + pix_vcmp16x8(ptr
+ wrap_y
*8, wrap_y
);
2388 interlaced_score
= pix_vcmp16x8(ptr
, wrap_y
*2) + pix_vcmp16x8(ptr
+ wrap_y
, wrap_y
*2);
2390 if(progressive_score
> interlaced_score
+ 100){
2391 s
->interlaced_dct
=1;
2396 s
->interlaced_dct
=0;
2399 s
->dsp
.get_pixels(s
->block
[0], ptr
, wrap_y
);
2400 s
->dsp
.get_pixels(s
->block
[1], ptr
+ 8, wrap_y
);
2401 s
->dsp
.get_pixels(s
->block
[2], ptr
+ dct_offset
, wrap_y
);
2402 s
->dsp
.get_pixels(s
->block
[3], ptr
+ dct_offset
+ 8, wrap_y
);
2404 if(s
->flags
&CODEC_FLAG_GRAY
){
2408 int wrap_c
= s
->uvlinesize
;
2409 ptr
= s
->new_picture
.data
[1] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
2411 emulated_edge_mc(s
, ptr
, wrap_c
, 8, 8, mb_x
*8, mb_y
*8, s
->width
>>1, s
->height
>>1);
2412 ptr
= s
->edge_emu_buffer
;
2414 s
->dsp
.get_pixels(s
->block
[4], ptr
, wrap_c
);
2416 ptr
= s
->new_picture
.data
[2] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
2418 emulated_edge_mc(s
, ptr
, wrap_c
, 8, 8, mb_x
*8, mb_y
*8, s
->width
>>1, s
->height
>>1);
2419 ptr
= s
->edge_emu_buffer
;
2421 s
->dsp
.get_pixels(s
->block
[5], ptr
, wrap_c
);
2424 op_pixels_func (*op_pix
)[4];
2425 qpel_mc_func (*op_qpix
)[16];
2426 UINT8
*dest_y
, *dest_cb
, *dest_cr
;
2427 UINT8
*ptr_y
, *ptr_cb
, *ptr_cr
;
2431 dest_y
= s
->current_picture
.data
[0] + (mb_y
* 16 * s
->linesize
) + mb_x
* 16;
2432 dest_cb
= s
->current_picture
.data
[1] + (mb_y
* 8 * (s
->uvlinesize
)) + mb_x
* 8;
2433 dest_cr
= s
->current_picture
.data
[2] + (mb_y
* 8 * (s
->uvlinesize
)) + mb_x
* 8;
2434 wrap_y
= s
->linesize
;
2435 wrap_c
= s
->uvlinesize
;
2436 ptr_y
= s
->new_picture
.data
[0] + (mb_y
* 16 * wrap_y
) + mb_x
* 16;
2437 ptr_cb
= s
->new_picture
.data
[1] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
2438 ptr_cr
= s
->new_picture
.data
[2] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
2440 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
){
2441 op_pix
= s
->dsp
.put_pixels_tab
;
2442 op_qpix
= s
->dsp
.put_qpel_pixels_tab
;
2444 op_pix
= s
->dsp
.put_no_rnd_pixels_tab
;
2445 op_qpix
= s
->dsp
.put_no_rnd_qpel_pixels_tab
;
2448 if (s
->mv_dir
& MV_DIR_FORWARD
) {
2449 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 0, s
->last_picture
.data
, op_pix
, op_qpix
);
2450 op_pix
= s
->dsp
.avg_pixels_tab
;
2451 op_qpix
= s
->dsp
.avg_qpel_pixels_tab
;
2453 if (s
->mv_dir
& MV_DIR_BACKWARD
) {
2454 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 1, s
->next_picture
.data
, op_pix
, op_qpix
);
2457 if(mb_x
*16+16 > s
->width
|| mb_y
*16+16 > s
->height
){
2458 emulated_edge_mc(s
, ptr_y
, wrap_y
, 16, 16, mb_x
*16, mb_y
*16, s
->width
, s
->height
);
2459 ptr_y
= s
->edge_emu_buffer
;
2463 if(s
->flags
&CODEC_FLAG_INTERLACED_DCT
){
2464 int progressive_score
, interlaced_score
;
2466 progressive_score
= pix_diff_vcmp16x8(ptr_y
, dest_y
, wrap_y
)
2467 + pix_diff_vcmp16x8(ptr_y
+ wrap_y
*8, dest_y
+ wrap_y
*8, wrap_y
);
2468 interlaced_score
= pix_diff_vcmp16x8(ptr_y
, dest_y
, wrap_y
*2)
2469 + pix_diff_vcmp16x8(ptr_y
+ wrap_y
, dest_y
+ wrap_y
, wrap_y
*2);
2471 if(progressive_score
> interlaced_score
+ 600){
2472 s
->interlaced_dct
=1;
2477 s
->interlaced_dct
=0;
2480 s
->dsp
.diff_pixels(s
->block
[0], ptr_y
, dest_y
, wrap_y
);
2481 s
->dsp
.diff_pixels(s
->block
[1], ptr_y
+ 8, dest_y
+ 8, wrap_y
);
2482 s
->dsp
.diff_pixels(s
->block
[2], ptr_y
+ dct_offset
, dest_y
+ dct_offset
, wrap_y
);
2483 s
->dsp
.diff_pixels(s
->block
[3], ptr_y
+ dct_offset
+ 8, dest_y
+ dct_offset
+ 8, wrap_y
);
2485 if(s
->flags
&CODEC_FLAG_GRAY
){
2490 emulated_edge_mc(s
, ptr_cb
, wrap_c
, 8, 8, mb_x
*8, mb_y
*8, s
->width
>>1, s
->height
>>1);
2491 ptr_cb
= s
->edge_emu_buffer
;
2493 s
->dsp
.diff_pixels(s
->block
[4], ptr_cb
, dest_cb
, wrap_c
);
2495 emulated_edge_mc(s
, ptr_cr
, wrap_c
, 8, 8, mb_x
*8, mb_y
*8, s
->width
>>1, s
->height
>>1);
2496 ptr_cr
= s
->edge_emu_buffer
;
2498 s
->dsp
.diff_pixels(s
->block
[5], ptr_cr
, dest_cr
, wrap_c
);
2500 /* pre quantization */
2501 if(s
->current_picture
.mc_mb_var
[s
->mb_width
*mb_y
+ mb_x
]<2*s
->qscale
*s
->qscale
){
2503 if(s
->dsp
.pix_abs8x8(ptr_y
, dest_y
, wrap_y
) < 20*s
->qscale
) skip_dct
[0]= 1;
2504 if(s
->dsp
.pix_abs8x8(ptr_y
+ 8, dest_y
+ 8, wrap_y
) < 20*s
->qscale
) skip_dct
[1]= 1;
2505 if(s
->dsp
.pix_abs8x8(ptr_y
+dct_offset
, dest_y
+dct_offset
, wrap_y
) < 20*s
->qscale
) skip_dct
[2]= 1;
2506 if(s
->dsp
.pix_abs8x8(ptr_y
+dct_offset
+ 8, dest_y
+dct_offset
+ 8, wrap_y
) < 20*s
->qscale
) skip_dct
[3]= 1;
2507 if(s
->dsp
.pix_abs8x8(ptr_cb
, dest_cb
, wrap_c
) < 20*s
->qscale
) skip_dct
[4]= 1;
2508 if(s
->dsp
.pix_abs8x8(ptr_cr
, dest_cr
, wrap_c
) < 20*s
->qscale
) skip_dct
[5]= 1;
2514 if(skip_dct
[i
]) num
++;
2517 if(s
->mb_x
==0 && s
->mb_y
==0){
2519 printf("%6d %1d\n", stat
[i
], i
);
2532 adap_parm
= ((s
->avg_mb_var
<< 1) + s
->mb_var
[s
->mb_width
*mb_y
+mb_x
] + 1.0) /
2533 ((s
->mb_var
[s
->mb_width
*mb_y
+mb_x
] << 1) + s
->avg_mb_var
+ 1.0);
2535 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
2536 (s
->mb_type
[s
->mb_width
*mb_y
+mb_x
] > 0) ? 'I' : 'P',
2537 s
->qscale
, adap_parm
, s
->qscale
*adap_parm
,
2538 s
->mb_var
[s
->mb_width
*mb_y
+mb_x
], s
->avg_mb_var
);
2541 /* DCT & quantize */
2542 if(s
->out_format
==FMT_MJPEG
){
2545 s
->block_last_index
[i
] = s
->dct_quantize(s
, s
->block
[i
], i
, 8, &overflow
);
2546 if (overflow
) clip_coeffs(s
, s
->block
[i
], s
->block_last_index
[i
]);
2552 s
->block_last_index
[i
] = s
->dct_quantize(s
, s
->block
[i
], i
, s
->qscale
, &overflow
);
2553 // FIXME we could decide to change to quantizer instead of clipping
2554 // JS: I don't think that would be a good idea it could lower quality instead
2555 // of improve it. Just INTRADC clipping deserves changes in quantizer
2556 if (overflow
) clip_coeffs(s
, s
->block
[i
], s
->block_last_index
[i
]);
2558 s
->block_last_index
[i
]= -1;
2560 if(s
->luma_elim_threshold
&& !s
->mb_intra
)
2562 dct_single_coeff_elimination(s
, i
, s
->luma_elim_threshold
);
2563 if(s
->chroma_elim_threshold
&& !s
->mb_intra
)
2565 dct_single_coeff_elimination(s
, i
, s
->chroma_elim_threshold
);
2568 if((s
->flags
&CODEC_FLAG_GRAY
) && s
->mb_intra
){
2569 s
->block_last_index
[4]=
2570 s
->block_last_index
[5]= 0;
2572 s
->block
[5][0]= 128;
2575 #ifdef CONFIG_ENCODERS
2576 /* huffman encode */
2577 switch(s
->out_format
) {
2579 mpeg1_encode_mb(s
, s
->block
, motion_x
, motion_y
);
2582 if (s
->h263_msmpeg4
)
2583 msmpeg4_encode_mb(s
, s
->block
, motion_x
, motion_y
);
2584 else if(s
->h263_pred
)
2585 mpeg4_encode_mb(s
, s
->block
, motion_x
, motion_y
);
2587 h263_encode_mb(s
, s
->block
, motion_x
, motion_y
);
2590 mjpeg_encode_mb(s
, s
->block
);
2596 void ff_copy_bits(PutBitContext
*pb
, UINT8
*src
, int length
)
2598 int bytes
= length
>>4;
2599 int bits
= length
&15;
2602 if(length
==0) return;
2604 for(i
=0; i
<bytes
; i
++) put_bits(pb
, 16, be2me_16(((uint16_t*)src
)[i
]));
2605 put_bits(pb
, bits
, be2me_16(((uint16_t*)src
)[i
])>>(16-bits
));
2608 static inline void copy_context_before_encode(MpegEncContext
*d
, MpegEncContext
*s
, int type
){
2611 memcpy(d
->last_mv
, s
->last_mv
, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
2614 d
->mb_incr
= s
->mb_incr
;
2616 d
->last_dc
[i
]= s
->last_dc
[i
];
2619 d
->mv_bits
= s
->mv_bits
;
2620 d
->i_tex_bits
= s
->i_tex_bits
;
2621 d
->p_tex_bits
= s
->p_tex_bits
;
2622 d
->i_count
= s
->i_count
;
2623 d
->f_count
= s
->f_count
;
2624 d
->b_count
= s
->b_count
;
2625 d
->skip_count
= s
->skip_count
;
2626 d
->misc_bits
= s
->misc_bits
;
2629 d
->mb_skiped
= s
->mb_skiped
;
2630 d
->qscale
= s
->qscale
;
2633 static inline void copy_context_after_encode(MpegEncContext
*d
, MpegEncContext
*s
, int type
){
2636 memcpy(d
->mv
, s
->mv
, 2*4*2*sizeof(int));
2637 memcpy(d
->last_mv
, s
->last_mv
, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
2640 d
->mb_incr
= s
->mb_incr
;
2642 d
->last_dc
[i
]= s
->last_dc
[i
];
2645 d
->mv_bits
= s
->mv_bits
;
2646 d
->i_tex_bits
= s
->i_tex_bits
;
2647 d
->p_tex_bits
= s
->p_tex_bits
;
2648 d
->i_count
= s
->i_count
;
2649 d
->f_count
= s
->f_count
;
2650 d
->b_count
= s
->b_count
;
2651 d
->skip_count
= s
->skip_count
;
2652 d
->misc_bits
= s
->misc_bits
;
2654 d
->mb_intra
= s
->mb_intra
;
2655 d
->mb_skiped
= s
->mb_skiped
;
2656 d
->mv_type
= s
->mv_type
;
2657 d
->mv_dir
= s
->mv_dir
;
2659 if(s
->data_partitioning
){
2661 d
->tex_pb
= s
->tex_pb
;
2665 d
->block_last_index
[i
]= s
->block_last_index
[i
];
2666 d
->interlaced_dct
= s
->interlaced_dct
;
2667 d
->qscale
= s
->qscale
;
2670 static inline void encode_mb_hq(MpegEncContext
*s
, MpegEncContext
*backup
, MpegEncContext
*best
, int type
,
2671 PutBitContext pb
[2], PutBitContext pb2
[2], PutBitContext tex_pb
[2],
2672 int *dmin
, int *next_block
, int motion_x
, int motion_y
)
2676 copy_context_before_encode(s
, backup
, type
);
2678 s
->block
= s
->blocks
[*next_block
];
2679 s
->pb
= pb
[*next_block
];
2680 if(s
->data_partitioning
){
2681 s
->pb2
= pb2
[*next_block
];
2682 s
->tex_pb
= tex_pb
[*next_block
];
2685 encode_mb(s
, motion_x
, motion_y
);
2687 bits_count
= get_bit_count(&s
->pb
);
2688 if(s
->data_partitioning
){
2689 bits_count
+= get_bit_count(&s
->pb2
);
2690 bits_count
+= get_bit_count(&s
->tex_pb
);
2693 if(bits_count
<*dmin
){
2697 copy_context_after_encode(best
, s
, type
);
2701 static inline int sse(MpegEncContext
*s
, uint8_t *src1
, uint8_t *src2
, int w
, int h
, int stride
){
2702 uint32_t *sq
= squareTbl
+ 256;
2707 return s
->dsp
.pix_norm(src1
, src2
, stride
);
2711 acc
+= sq
[src1
[x
+ y
*stride
] - src2
[x
+ y
*stride
]];
2717 static void encode_picture(MpegEncContext
*s
, int picture_number
)
2719 int mb_x
, mb_y
, pdif
= 0;
2722 MpegEncContext best_s
, backup_s
;
2723 UINT8 bit_buf
[2][3000];
2724 UINT8 bit_buf2
[2][3000];
2725 UINT8 bit_buf_tex
[2][3000];
2726 PutBitContext pb
[2], pb2
[2], tex_pb
[2];
2729 init_put_bits(&pb
[i
], bit_buf
[i
], 3000, NULL
, NULL
);
2730 init_put_bits(&pb2
[i
], bit_buf2
[i
], 3000, NULL
, NULL
);
2731 init_put_bits(&tex_pb
[i
], bit_buf_tex
[i
], 3000, NULL
, NULL
);
2734 s
->picture_number
= picture_number
;
2739 s
->block_wrap
[3]= s
->mb_width
*2 + 2;
2741 s
->block_wrap
[5]= s
->mb_width
+ 2;
2743 /* Reset the average MB variance */
2744 s
->current_picture
.mb_var_sum
= 0;
2745 s
->current_picture
.mc_mb_var_sum
= 0;
2747 /* we need to initialize some time vars before we can encode b-frames */
2748 if (s
->h263_pred
&& !s
->h263_msmpeg4
)
2749 ff_set_mpeg4_time(s
, s
->picture_number
);
2751 s
->scene_change_score
=0;
2753 s
->qscale
= (int)(s
->frame_qscale
+ 0.5); //FIXME qscale / ... stuff for ME ratedistoration
2755 /* Estimate motion for every MB */
2756 if(s
->pict_type
!= I_TYPE
){
2757 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
2758 s
->block_index
[0]= s
->block_wrap
[0]*(mb_y
*2 + 1) - 1;
2759 s
->block_index
[1]= s
->block_wrap
[0]*(mb_y
*2 + 1);
2760 s
->block_index
[2]= s
->block_wrap
[0]*(mb_y
*2 + 2) - 1;
2761 s
->block_index
[3]= s
->block_wrap
[0]*(mb_y
*2 + 2);
2762 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
2765 s
->block_index
[0]+=2;
2766 s
->block_index
[1]+=2;
2767 s
->block_index
[2]+=2;
2768 s
->block_index
[3]+=2;
2770 /* compute motion vector & mb_type and store in context */
2771 if(s
->pict_type
==B_TYPE
)
2772 ff_estimate_b_frame_motion(s
, mb_x
, mb_y
);
2774 ff_estimate_p_frame_motion(s
, mb_x
, mb_y
);
2775 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
2778 }else /* if(s->pict_type == I_TYPE) */{
2780 //FIXME do we need to zero them?
2781 memset(s
->motion_val
[0], 0, sizeof(INT16
)*(s
->mb_width
*2 + 2)*(s
->mb_height
*2 + 2)*2);
2782 memset(s
->p_mv_table
, 0, sizeof(INT16
)*(s
->mb_width
+2)*(s
->mb_height
+2)*2);
2783 memset(s
->mb_type
, MB_TYPE_INTRA
, sizeof(UINT8
)*s
->mb_width
*s
->mb_height
);
2785 if(!s
->fixed_qscale
){
2786 /* finding spatial complexity for I-frame rate control */
2787 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
2788 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
2791 uint8_t *pix
= s
->new_picture
.data
[0] + (yy
* s
->linesize
) + xx
;
2793 int sum
= s
->dsp
.pix_sum(pix
, s
->linesize
);
2795 varc
= (s
->dsp
.pix_norm1(pix
, s
->linesize
) - (((unsigned)(sum
*sum
))>>8) + 500 + 128)>>8;
2797 s
->current_picture
.mb_var
[s
->mb_width
* mb_y
+ mb_x
] = varc
;
2798 s
->current_picture
.mb_mean
[s
->mb_width
* mb_y
+ mb_x
] = (sum
+128)>>8;
2799 s
->current_picture
.mb_var_sum
+= varc
;
2806 if(s
->scene_change_score
> 0 && s
->pict_type
== P_TYPE
){
2807 s
->pict_type
= I_TYPE
;
2808 memset(s
->mb_type
, MB_TYPE_INTRA
, sizeof(UINT8
)*s
->mb_width
*s
->mb_height
);
2809 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
2812 if(s
->pict_type
==P_TYPE
|| s
->pict_type
==S_TYPE
)
2813 s
->f_code
= ff_get_best_fcode(s
, s
->p_mv_table
, MB_TYPE_INTER
);
2814 ff_fix_long_p_mvs(s
);
2815 if(s
->pict_type
==B_TYPE
){
2816 s
->f_code
= ff_get_best_fcode(s
, s
->b_forw_mv_table
, MB_TYPE_FORWARD
);
2817 s
->b_code
= ff_get_best_fcode(s
, s
->b_back_mv_table
, MB_TYPE_BACKWARD
);
2819 ff_fix_long_b_mvs(s
, s
->b_forw_mv_table
, s
->f_code
, MB_TYPE_FORWARD
);
2820 ff_fix_long_b_mvs(s
, s
->b_back_mv_table
, s
->b_code
, MB_TYPE_BACKWARD
);
2821 ff_fix_long_b_mvs(s
, s
->b_bidir_forw_mv_table
, s
->f_code
, MB_TYPE_BIDIR
);
2822 ff_fix_long_b_mvs(s
, s
->b_bidir_back_mv_table
, s
->b_code
, MB_TYPE_BIDIR
);
2825 if (s
->fixed_qscale
)
2826 s
->frame_qscale
= s
->current_picture
.quality
;
2828 s
->frame_qscale
= ff_rate_estimate_qscale(s
);
2830 if(s
->adaptive_quant
){
2831 switch(s
->codec_id
){
2832 case CODEC_ID_MPEG4
:
2833 ff_clean_mpeg4_qscales(s
);
2836 case CODEC_ID_H263P
:
2837 ff_clean_h263_qscales(s
);
2841 s
->qscale
= s
->current_picture
.qscale_table
[0];
2843 s
->qscale
= (int)(s
->frame_qscale
+ 0.5);
2845 if (s
->out_format
== FMT_MJPEG
) {
2846 /* for mjpeg, we do include qscale in the matrix */
2847 s
->intra_matrix
[0] = ff_mpeg1_default_intra_matrix
[0];
2849 int j
= s
->idct_permutation
[i
];
2851 s
->intra_matrix
[j
] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix
[i
] * s
->qscale
) >> 3);
2853 convert_matrix(s
, s
->q_intra_matrix
, s
->q_intra_matrix16
,
2854 s
->q_intra_matrix16_bias
, s
->intra_matrix
, s
->intra_quant_bias
, 8, 8);
2857 //FIXME var duplication
2858 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
2859 s
->current_picture
.pict_type
= s
->pict_type
;
2861 if(s
->current_picture
.key_frame
)
2862 s
->picture_in_gop_number
=0;
2864 s
->last_bits
= get_bit_count(&s
->pb
);
2865 switch(s
->out_format
) {
2867 mjpeg_picture_header(s
);
2870 if (s
->h263_msmpeg4
)
2871 msmpeg4_encode_picture_header(s
, picture_number
);
2872 else if (s
->h263_pred
)
2873 mpeg4_encode_picture_header(s
, picture_number
);
2874 else if (s
->h263_rv10
)
2875 rv10_encode_picture_header(s
, picture_number
);
2877 h263_encode_picture_header(s
, picture_number
);
2880 mpeg1_encode_picture_header(s
, picture_number
);
2883 bits
= get_bit_count(&s
->pb
);
2884 s
->header_bits
= bits
- s
->last_bits
;
2896 /* init last dc values */
2897 /* note: quant matrix value (8) is implied here */
2898 s
->last_dc
[i
] = 128;
2900 s
->current_picture
.error
[i
] = 0;
2903 s
->last_mv
[0][0][0] = 0;
2904 s
->last_mv
[0][0][1] = 0;
2906 if (s
->codec_id
==CODEC_ID_H263
|| s
->codec_id
==CODEC_ID_H263P
)
2907 s
->gob_index
= ff_h263_get_gob_height(s
);
2909 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->partitioned_frame
)
2910 ff_mpeg4_init_partitions(s
);
2914 s
->first_slice_line
= 1;
2915 s
->ptr_lastgob
= s
->pb
.buf
;
2916 s
->ptr_last_mb_line
= s
->pb
.buf
;
2917 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
2918 s
->y_dc_scale
= s
->y_dc_scale_table
[ s
->qscale
];
2919 s
->c_dc_scale
= s
->c_dc_scale_table
[ s
->qscale
];
2921 s
->block_index
[0]= s
->block_wrap
[0]*(mb_y
*2 + 1) - 1;
2922 s
->block_index
[1]= s
->block_wrap
[0]*(mb_y
*2 + 1);
2923 s
->block_index
[2]= s
->block_wrap
[0]*(mb_y
*2 + 2) - 1;
2924 s
->block_index
[3]= s
->block_wrap
[0]*(mb_y
*2 + 2);
2925 s
->block_index
[4]= s
->block_wrap
[4]*(mb_y
+ 1) + s
->block_wrap
[0]*(s
->mb_height
*2 + 2);
2926 s
->block_index
[5]= s
->block_wrap
[4]*(mb_y
+ 1 + s
->mb_height
+ 2) + s
->block_wrap
[0]*(s
->mb_height
*2 + 2);
2927 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
2928 const int mb_type
= s
->mb_type
[mb_y
* s
->mb_width
+ mb_x
];
2929 const int xy
= (mb_y
+1) * (s
->mb_width
+2) + mb_x
+ 1;
2935 s
->block_index
[0]+=2;
2936 s
->block_index
[1]+=2;
2937 s
->block_index
[2]+=2;
2938 s
->block_index
[3]+=2;
2939 s
->block_index
[4]++;
2940 s
->block_index
[5]++;
2942 /* write gob / video packet header */
2944 int current_packet_size
, is_gob_start
;
2946 current_packet_size
= pbBufPtr(&s
->pb
) - s
->ptr_lastgob
;
2949 if(s
->codec_id
==CODEC_ID_MPEG4
){
2950 if(current_packet_size
+ s
->mb_line_avgsize
/s
->mb_width
>= s
->rtp_payload_size
2951 && s
->mb_y
+ s
->mb_x
>0){
2953 if(s
->partitioned_frame
){
2954 ff_mpeg4_merge_partitions(s
);
2955 ff_mpeg4_init_partitions(s
);
2957 ff_mpeg4_encode_video_packet_header(s
);
2959 if(s
->flags
&CODEC_FLAG_PASS1
){
2960 int bits
= get_bit_count(&s
->pb
);
2961 s
->misc_bits
+= bits
- s
->last_bits
;
2964 ff_mpeg4_clean_buffers(s
);
2968 if(current_packet_size
+ s
->mb_line_avgsize
*s
->gob_index
>= s
->rtp_payload_size
2969 && s
->mb_x
==0 && s
->mb_y
>0 && s
->mb_y
%s
->gob_index
==0){
2971 h263_encode_gob_header(s
, mb_y
);
2977 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
2978 s
->first_slice_line
=1;
2979 s
->resync_mb_x
=mb_x
;
2980 s
->resync_mb_y
=mb_y
;
2984 if( (s
->resync_mb_x
== s
->mb_x
)
2985 && s
->resync_mb_y
+1 == s
->mb_y
){
2986 s
->first_slice_line
=0;
2989 if(mb_type
& (mb_type
-1)){ // more than 1 MB type possible
2991 int pb_bits_count
, pb2_bits_count
, tex_pb_bits_count
;
2993 copy_context_before_encode(&backup_s
, s
, -1);
2995 best_s
.data_partitioning
= s
->data_partitioning
;
2996 best_s
.partitioned_frame
= s
->partitioned_frame
;
2997 if(s
->data_partitioning
){
2998 backup_s
.pb2
= s
->pb2
;
2999 backup_s
.tex_pb
= s
->tex_pb
;
3002 if(mb_type
&MB_TYPE_INTER
){
3003 s
->mv_dir
= MV_DIR_FORWARD
;
3004 s
->mv_type
= MV_TYPE_16X16
;
3006 s
->mv
[0][0][0] = s
->p_mv_table
[xy
][0];
3007 s
->mv
[0][0][1] = s
->p_mv_table
[xy
][1];
3008 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTER
, pb
, pb2
, tex_pb
,
3009 &dmin
, &next_block
, s
->mv
[0][0][0], s
->mv
[0][0][1]);
3011 if(mb_type
&MB_TYPE_INTER4V
){
3012 s
->mv_dir
= MV_DIR_FORWARD
;
3013 s
->mv_type
= MV_TYPE_8X8
;
3016 s
->mv
[0][i
][0] = s
->motion_val
[s
->block_index
[i
]][0];
3017 s
->mv
[0][i
][1] = s
->motion_val
[s
->block_index
[i
]][1];
3019 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTER4V
, pb
, pb2
, tex_pb
,
3020 &dmin
, &next_block
, 0, 0);
3022 if(mb_type
&MB_TYPE_FORWARD
){
3023 s
->mv_dir
= MV_DIR_FORWARD
;
3024 s
->mv_type
= MV_TYPE_16X16
;
3026 s
->mv
[0][0][0] = s
->b_forw_mv_table
[xy
][0];
3027 s
->mv
[0][0][1] = s
->b_forw_mv_table
[xy
][1];
3028 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_FORWARD
, pb
, pb2
, tex_pb
,
3029 &dmin
, &next_block
, s
->mv
[0][0][0], s
->mv
[0][0][1]);
3031 if(mb_type
&MB_TYPE_BACKWARD
){
3032 s
->mv_dir
= MV_DIR_BACKWARD
;
3033 s
->mv_type
= MV_TYPE_16X16
;
3035 s
->mv
[1][0][0] = s
->b_back_mv_table
[xy
][0];
3036 s
->mv
[1][0][1] = s
->b_back_mv_table
[xy
][1];
3037 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_BACKWARD
, pb
, pb2
, tex_pb
,
3038 &dmin
, &next_block
, s
->mv
[1][0][0], s
->mv
[1][0][1]);
3040 if(mb_type
&MB_TYPE_BIDIR
){
3041 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
;
3042 s
->mv_type
= MV_TYPE_16X16
;
3044 s
->mv
[0][0][0] = s
->b_bidir_forw_mv_table
[xy
][0];
3045 s
->mv
[0][0][1] = s
->b_bidir_forw_mv_table
[xy
][1];
3046 s
->mv
[1][0][0] = s
->b_bidir_back_mv_table
[xy
][0];
3047 s
->mv
[1][0][1] = s
->b_bidir_back_mv_table
[xy
][1];
3048 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_BIDIR
, pb
, pb2
, tex_pb
,
3049 &dmin
, &next_block
, 0, 0);
3051 if(mb_type
&MB_TYPE_DIRECT
){
3052 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
| MV_DIRECT
;
3053 s
->mv_type
= MV_TYPE_16X16
; //FIXME
3055 s
->mv
[0][0][0] = s
->b_direct_forw_mv_table
[xy
][0];
3056 s
->mv
[0][0][1] = s
->b_direct_forw_mv_table
[xy
][1];
3057 s
->mv
[1][0][0] = s
->b_direct_back_mv_table
[xy
][0];
3058 s
->mv
[1][0][1] = s
->b_direct_back_mv_table
[xy
][1];
3059 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_DIRECT
, pb
, pb2
, tex_pb
,
3060 &dmin
, &next_block
, s
->b_direct_mv_table
[xy
][0], s
->b_direct_mv_table
[xy
][1]);
3062 if(mb_type
&MB_TYPE_INTRA
){
3063 s
->mv_dir
= MV_DIR_FORWARD
;
3064 s
->mv_type
= MV_TYPE_16X16
;
3068 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTRA
, pb
, pb2
, tex_pb
,
3069 &dmin
, &next_block
, 0, 0);
3070 /* force cleaning of ac/dc pred stuff if needed ... */
3071 if(s
->h263_pred
|| s
->h263_aic
)
3072 s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
]=1;
3074 copy_context_after_encode(s
, &best_s
, -1);
3076 pb_bits_count
= get_bit_count(&s
->pb
);
3077 flush_put_bits(&s
->pb
);
3078 ff_copy_bits(&backup_s
.pb
, bit_buf
[next_block
^1], pb_bits_count
);
3081 if(s
->data_partitioning
){
3082 pb2_bits_count
= get_bit_count(&s
->pb2
);
3083 flush_put_bits(&s
->pb2
);
3084 ff_copy_bits(&backup_s
.pb2
, bit_buf2
[next_block
^1], pb2_bits_count
);
3085 s
->pb2
= backup_s
.pb2
;
3087 tex_pb_bits_count
= get_bit_count(&s
->tex_pb
);
3088 flush_put_bits(&s
->tex_pb
);
3089 ff_copy_bits(&backup_s
.tex_pb
, bit_buf_tex
[next_block
^1], tex_pb_bits_count
);
3090 s
->tex_pb
= backup_s
.tex_pb
;
3092 s
->last_bits
= get_bit_count(&s
->pb
);
3094 int motion_x
, motion_y
;
3095 s
->mv_type
=MV_TYPE_16X16
;
3096 // only one MB-Type possible
3099 s
->mv_dir
= MV_DIR_FORWARD
;
3101 motion_x
= s
->mv
[0][0][0] = 0;
3102 motion_y
= s
->mv
[0][0][1] = 0;
3105 s
->mv_dir
= MV_DIR_FORWARD
;
3107 motion_x
= s
->mv
[0][0][0] = s
->p_mv_table
[xy
][0];
3108 motion_y
= s
->mv
[0][0][1] = s
->p_mv_table
[xy
][1];
3110 case MB_TYPE_INTER4V
:
3111 s
->mv_dir
= MV_DIR_FORWARD
;
3112 s
->mv_type
= MV_TYPE_8X8
;
3115 s
->mv
[0][i
][0] = s
->motion_val
[s
->block_index
[i
]][0];
3116 s
->mv
[0][i
][1] = s
->motion_val
[s
->block_index
[i
]][1];
3118 motion_x
= motion_y
= 0;
3120 case MB_TYPE_DIRECT
:
3121 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
| MV_DIRECT
;
3123 motion_x
=s
->b_direct_mv_table
[xy
][0];
3124 motion_y
=s
->b_direct_mv_table
[xy
][1];
3125 s
->mv
[0][0][0] = s
->b_direct_forw_mv_table
[xy
][0];
3126 s
->mv
[0][0][1] = s
->b_direct_forw_mv_table
[xy
][1];
3127 s
->mv
[1][0][0] = s
->b_direct_back_mv_table
[xy
][0];
3128 s
->mv
[1][0][1] = s
->b_direct_back_mv_table
[xy
][1];
3131 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
;
3135 s
->mv
[0][0][0] = s
->b_bidir_forw_mv_table
[xy
][0];
3136 s
->mv
[0][0][1] = s
->b_bidir_forw_mv_table
[xy
][1];
3137 s
->mv
[1][0][0] = s
->b_bidir_back_mv_table
[xy
][0];
3138 s
->mv
[1][0][1] = s
->b_bidir_back_mv_table
[xy
][1];
3140 case MB_TYPE_BACKWARD
:
3141 s
->mv_dir
= MV_DIR_BACKWARD
;
3143 motion_x
= s
->mv
[1][0][0] = s
->b_back_mv_table
[xy
][0];
3144 motion_y
= s
->mv
[1][0][1] = s
->b_back_mv_table
[xy
][1];
3146 case MB_TYPE_FORWARD
:
3147 s
->mv_dir
= MV_DIR_FORWARD
;
3149 motion_x
= s
->mv
[0][0][0] = s
->b_forw_mv_table
[xy
][0];
3150 motion_y
= s
->mv
[0][0][1] = s
->b_forw_mv_table
[xy
][1];
3151 // printf(" %d %d ", motion_x, motion_y);
3154 motion_x
=motion_y
=0; //gcc warning fix
3155 printf("illegal MB type\n");
3157 encode_mb(s
, motion_x
, motion_y
);
3159 /* clean the MV table in IPS frames for direct mode in B frames */
3160 if(s
->mb_intra
/* && I,P,S_TYPE */){
3161 s
->p_mv_table
[xy
][0]=0;
3162 s
->p_mv_table
[xy
][1]=0;
3165 MPV_decode_mb(s
, s
->block
);
3167 if(s
->flags
&CODEC_FLAG_PSNR
){
3171 if(s
->mb_x
*16 + 16 > s
->width
) w
= s
->width
- s
->mb_x
*16;
3172 if(s
->mb_y
*16 + 16 > s
->height
) h
= s
->height
- s
->mb_y
*16;
3174 s
->current_picture
.error
[0] += sse(
3176 s
->new_picture
.data
[0] + s
->mb_x
*16 + s
->mb_y
*s
->linesize
*16,
3177 s
->current_picture
.data
[0] + s
->mb_x
*16 + s
->mb_y
*s
->linesize
*16,
3179 s
->current_picture
.error
[1] += sse(
3181 s
->new_picture
.data
[1] + s
->mb_x
*8 + s
->mb_y
*s
->uvlinesize
*8,
3182 s
->current_picture
.data
[1] + s
->mb_x
*8 + s
->mb_y
*s
->uvlinesize
*8,
3183 w
>>1, h
>>1, s
->uvlinesize
);
3184 s
->current_picture
.error
[2] += sse(
3186 s
->new_picture
.data
[2] + s
->mb_x
*8 + s
->mb_y
*s
->uvlinesize
*8,
3187 s
->current_picture
.data
[2] + s
->mb_x
*8 + s
->mb_y
*s
->uvlinesize
*8,
3188 w
>>1, h
>>1, s
->uvlinesize
);
3190 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_width, get_bit_count(&s->pb));
3194 /* Obtain average mb_row size for RTP */
3197 s
->mb_line_avgsize
= pbBufPtr(&s
->pb
) - s
->ptr_last_mb_line
;
3199 s
->mb_line_avgsize
= (s
->mb_line_avgsize
+ pbBufPtr(&s
->pb
) - s
->ptr_last_mb_line
) >> 1;
3201 s
->ptr_last_mb_line
= pbBufPtr(&s
->pb
);
3206 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->partitioned_frame
)
3207 ff_mpeg4_merge_partitions(s
);
3209 if (s
->msmpeg4_version
&& s
->msmpeg4_version
<4 && s
->pict_type
== I_TYPE
)
3210 msmpeg4_encode_ext_header(s
);
3212 if(s
->codec_id
==CODEC_ID_MPEG4
)
3213 ff_mpeg4_stuffing(&s
->pb
);
3215 //if (s->gob_number)
3216 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
3218 /* Send the last GOB if RTP */
3220 flush_put_bits(&s
->pb
);
3221 pdif
= pbBufPtr(&s
->pb
) - s
->ptr_lastgob
;
3222 /* Call the RTP callback to send the last GOB */
3223 if (s
->rtp_callback
)
3224 s
->rtp_callback(s
->ptr_lastgob
, pdif
, s
->gob_number
);
3225 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
3226 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
3230 static int dct_quantize_c(MpegEncContext
*s
,
3231 DCTELEM
*block
, int n
,
3232 int qscale
, int *overflow
)
3234 int i
, j
, level
, last_non_zero
, q
;
3236 const UINT8
*scantable
= s
->intra_scantable
.scantable
;
3239 unsigned int threshold1
, threshold2
;
3251 /* For AIC we skip quant/dequant of INTRADC */
3254 /* note: block[0] is assumed to be positive */
3255 block
[0] = (block
[0] + (q
>> 1)) / q
;
3258 qmat
= s
->q_intra_matrix
[qscale
];
3259 bias
= s
->intra_quant_bias
<<(QMAT_SHIFT
- QUANT_BIAS_SHIFT
);
3263 qmat
= s
->q_inter_matrix
[qscale
];
3264 bias
= s
->inter_quant_bias
<<(QMAT_SHIFT
- QUANT_BIAS_SHIFT
);
3266 threshold1
= (1<<QMAT_SHIFT
) - bias
- 1;
3267 threshold2
= (threshold1
<<1);
3272 level
= level
* qmat
[j
];
3274 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
3275 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
3276 if(((unsigned)(level
+threshold1
))>threshold2
){
3278 level
= (bias
+ level
)>>QMAT_SHIFT
;
3281 level
= (bias
- level
)>>QMAT_SHIFT
;
3290 *overflow
= s
->max_qcoeff
< max
; //overflow might have happend
3292 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
3293 if (s
->idct_permutation_type
!= FF_NO_IDCT_PERM
)
3294 ff_block_permute(block
, s
->idct_permutation
, scantable
, last_non_zero
);
3296 return last_non_zero
;
3299 static void dct_unquantize_mpeg1_c(MpegEncContext
*s
,
3300 DCTELEM
*block
, int n
, int qscale
)
3302 int i
, level
, nCoeffs
;
3303 const UINT16
*quant_matrix
;
3305 nCoeffs
= s
->block_last_index
[n
];
3309 block
[0] = block
[0] * s
->y_dc_scale
;
3311 block
[0] = block
[0] * s
->c_dc_scale
;
3312 /* XXX: only mpeg1 */
3313 quant_matrix
= s
->intra_matrix
;
3314 for(i
=1;i
<=nCoeffs
;i
++) {
3315 int j
= s
->intra_scantable
.permutated
[i
];
3320 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
3321 level
= (level
- 1) | 1;
3324 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
3325 level
= (level
- 1) | 1;
3328 if (level
< -2048 || level
> 2047)
3329 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
3336 quant_matrix
= s
->inter_matrix
;
3337 for(;i
<=nCoeffs
;i
++) {
3338 int j
= s
->intra_scantable
.permutated
[i
];
3343 level
= (((level
<< 1) + 1) * qscale
*
3344 ((int) (quant_matrix
[j
]))) >> 4;
3345 level
= (level
- 1) | 1;
3348 level
= (((level
<< 1) + 1) * qscale
*
3349 ((int) (quant_matrix
[j
]))) >> 4;
3350 level
= (level
- 1) | 1;
3353 if (level
< -2048 || level
> 2047)
3354 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
3362 static void dct_unquantize_mpeg2_c(MpegEncContext
*s
,
3363 DCTELEM
*block
, int n
, int qscale
)
3365 int i
, level
, nCoeffs
;
3366 const UINT16
*quant_matrix
;
3368 if(s
->alternate_scan
) nCoeffs
= 63;
3369 else nCoeffs
= s
->block_last_index
[n
];
3373 block
[0] = block
[0] * s
->y_dc_scale
;
3375 block
[0] = block
[0] * s
->c_dc_scale
;
3376 quant_matrix
= s
->intra_matrix
;
3377 for(i
=1;i
<=nCoeffs
;i
++) {
3378 int j
= s
->intra_scantable
.permutated
[i
];
3383 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
3386 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
3389 if (level
< -2048 || level
> 2047)
3390 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
3398 quant_matrix
= s
->inter_matrix
;
3399 for(;i
<=nCoeffs
;i
++) {
3400 int j
= s
->intra_scantable
.permutated
[i
];
3405 level
= (((level
<< 1) + 1) * qscale
*
3406 ((int) (quant_matrix
[j
]))) >> 4;
3409 level
= (((level
<< 1) + 1) * qscale
*
3410 ((int) (quant_matrix
[j
]))) >> 4;
3413 if (level
< -2048 || level
> 2047)
3414 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
3425 static void dct_unquantize_h263_c(MpegEncContext
*s
,
3426 DCTELEM
*block
, int n
, int qscale
)
3428 int i
, level
, qmul
, qadd
;
3431 assert(s
->block_last_index
[n
]>=0);
3433 qadd
= (qscale
- 1) | 1;
3439 block
[0] = block
[0] * s
->y_dc_scale
;
3441 block
[0] = block
[0] * s
->c_dc_scale
;
3445 nCoeffs
= 63; //does not allways use zigzag table
3448 nCoeffs
= s
->intra_scantable
.raster_end
[ s
->block_last_index
[n
] ];
3451 for(;i
<=nCoeffs
;i
++) {
3455 level
= level
* qmul
- qadd
;
3457 level
= level
* qmul
+ qadd
;
3460 if (level
< -2048 || level
> 2047)
3461 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
3468 char ff_get_pict_type_char(int pict_type
){
3470 case I_TYPE
: return 'I';
3471 case P_TYPE
: return 'P';
3472 case B_TYPE
: return 'B';
3473 case S_TYPE
: return 'S';
3477 AVCodec mpeg1video_encoder
= {
3480 CODEC_ID_MPEG1VIDEO
,
3481 sizeof(MpegEncContext
),
3487 AVCodec h263_encoder
= {
3491 sizeof(MpegEncContext
),
3497 AVCodec h263p_encoder
= {
3501 sizeof(MpegEncContext
),
3507 AVCodec rv10_encoder
= {
3511 sizeof(MpegEncContext
),
3517 AVCodec mjpeg_encoder
= {
3521 sizeof(MpegEncContext
),
3527 AVCodec mpeg4_encoder
= {
3531 sizeof(MpegEncContext
),
3537 AVCodec msmpeg4v1_encoder
= {
3541 sizeof(MpegEncContext
),
3547 AVCodec msmpeg4v2_encoder
= {
3551 sizeof(MpegEncContext
),
3557 AVCodec msmpeg4v3_encoder
= {
3561 sizeof(MpegEncContext
),
3567 AVCodec wmv1_encoder
= {
3571 sizeof(MpegEncContext
),
3577 AVCodec wmv2_encoder
= {
3581 sizeof(MpegEncContext
),