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>
23 #include "mpegvideo.h"
26 #include "fastmemcpy.h"
29 static void encode_picture(MpegEncContext
*s
, int picture_number
);
30 static void dct_unquantize_mpeg1_c(MpegEncContext
*s
,
31 DCTELEM
*block
, int n
, int qscale
);
32 static void dct_unquantize_mpeg2_c(MpegEncContext
*s
,
33 DCTELEM
*block
, int n
, int qscale
);
34 static void dct_unquantize_h263_c(MpegEncContext
*s
,
35 DCTELEM
*block
, int n
, int qscale
);
36 static void draw_edges_c(UINT8
*buf
, int wrap
, int width
, int height
, int w
);
37 static int dct_quantize_c(MpegEncContext
*s
, DCTELEM
*block
, int n
, int qscale
, int *overflow
);
39 int (*dct_quantize
)(MpegEncContext
*s
, DCTELEM
*block
, int n
, int qscale
, int *overflow
)= dct_quantize_c
;
40 void (*draw_edges
)(UINT8
*buf
, int wrap
, int width
, int height
, int w
)= draw_edges_c
;
44 /* enable all paranoid tests for rounding, overflows, etc... */
50 /* for jpeg fast DCT */
53 static const unsigned short aanscales
[64] = {
54 /* precomputed values scaled up by 14 bits */
55 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
56 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
57 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
58 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
59 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
60 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
61 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
62 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
65 static UINT8 h263_chroma_roundtab
[16] = {
66 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
69 static UINT16 default_mv_penalty
[MAX_FCODE
+1][MAX_MV
*2+1];
70 static UINT8 default_fcode_tab
[MAX_MV
*2+1];
72 extern UINT8 zigzag_end
[64];
74 /* default motion estimation */
75 int motion_estimation_method
= ME_EPZS
;
77 static void convert_matrix(int (*qmat
)[64], uint16_t (*qmat16
)[64], uint16_t (*qmat16_bias
)[64],
78 const UINT16
*quant_matrix
, int bias
)
82 for(qscale
=1; qscale
<32; qscale
++){
84 if (av_fdct
== fdct_ifast
) {
86 const int j
= block_permute_op(i
);
87 /* 16 <= qscale * quant_matrix[i] <= 7905 */
88 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
89 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
90 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
92 qmat
[qscale
][j
] = (int)((UINT64_C(1) << (QMAT_SHIFT
+ 11)) /
93 (aanscales
[i
] * qscale
* quant_matrix
[j
]));
97 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
98 So 16 <= qscale * quant_matrix[i] <= 7905
99 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
100 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
102 qmat
[qscale
][i
] = (1 << QMAT_SHIFT_MMX
) / (qscale
* quant_matrix
[i
]);
103 qmat16
[qscale
][i
] = (1 << QMAT_SHIFT_MMX
) / (qscale
* quant_matrix
[block_permute_op(i
)]);
105 if(qmat16
[qscale
][i
]==0 || qmat16
[qscale
][i
]==128*256) qmat16
[qscale
][i
]=128*256-1;
107 qmat16_bias
[qscale
][i
]= ROUNDED_DIV(bias
<<(16-QUANT_BIAS_SHIFT
), qmat16
[qscale
][i
]);
112 // move into common.c perhaps
113 #define CHECKED_ALLOCZ(p, size)\
115 p= av_mallocz(size);\
122 /* init common structure for both encoder and decoder */
123 int MPV_common_init(MpegEncContext
*s
)
128 s
->dct_unquantize_h263
= dct_unquantize_h263_c
;
129 s
->dct_unquantize_mpeg1
= dct_unquantize_mpeg1_c
;
130 s
->dct_unquantize_mpeg2
= dct_unquantize_mpeg2_c
;
133 MPV_common_init_mmx(s
);
135 //setup default unquantizers (mpeg4 might change it later)
136 if(s
->out_format
== FMT_H263
)
137 s
->dct_unquantize
= s
->dct_unquantize_h263
;
139 s
->dct_unquantize
= s
->dct_unquantize_mpeg1
;
141 s
->mb_width
= (s
->width
+ 15) / 16;
142 s
->mb_height
= (s
->height
+ 15) / 16;
143 s
->mb_num
= s
->mb_width
* s
->mb_height
;
144 s
->linesize
= s
->mb_width
* 16 + 2 * EDGE_WIDTH
;
147 int w
, h
, shift
, pict_start
;
150 h
= s
->mb_height
* 16 + 2 * EDGE_WIDTH
;
151 shift
= (i
== 0) ?
0 : 1;
152 c_size
= (w
>> shift
) * (h
>> shift
);
153 pict_start
= (w
>> shift
) * (EDGE_WIDTH
>> shift
) + (EDGE_WIDTH
>> shift
);
155 CHECKED_ALLOCZ(pict
, c_size
)
156 s
->last_picture_base
[i
] = pict
;
157 s
->last_picture
[i
] = pict
+ pict_start
;
159 CHECKED_ALLOCZ(pict
, c_size
)
160 s
->next_picture_base
[i
] = pict
;
161 s
->next_picture
[i
] = pict
+ pict_start
;
163 if (s
->has_b_frames
|| s
->codec_id
==CODEC_ID_MPEG4
) {
164 /* Note the MPEG4 stuff is here cuz of buggy encoders which dont set the low_delay flag but
165 do low-delay encoding, so we cant allways distinguish b-frame containing streams from low_delay streams */
166 CHECKED_ALLOCZ(pict
, c_size
)
167 s
->aux_picture_base
[i
] = pict
;
168 s
->aux_picture
[i
] = pict
+ pict_start
;
174 int mv_table_size
= (s
->mb_width
+2)*(s
->mb_height
+2);
176 CHECKED_ALLOCZ(s
->mb_var
, s
->mb_num
* sizeof(INT16
))
177 CHECKED_ALLOCZ(s
->mc_mb_var
, s
->mb_num
* sizeof(INT16
))
179 /* Allocate MV tables */
180 CHECKED_ALLOCZ(s
->p_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
181 CHECKED_ALLOCZ(s
->b_forw_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
182 CHECKED_ALLOCZ(s
->b_back_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
183 CHECKED_ALLOCZ(s
->b_bidir_forw_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
184 CHECKED_ALLOCZ(s
->b_bidir_back_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
185 CHECKED_ALLOCZ(s
->b_direct_forw_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
186 CHECKED_ALLOCZ(s
->b_direct_back_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
187 CHECKED_ALLOCZ(s
->b_direct_mv_table
, mv_table_size
* 2 * sizeof(INT16
))
189 CHECKED_ALLOCZ(s
->me_scratchpad
, s
->linesize
*16*3*sizeof(uint8_t))
191 CHECKED_ALLOCZ(s
->me_map
, ME_MAP_SIZE
*sizeof(uint32_t))
192 CHECKED_ALLOCZ(s
->me_score_map
, ME_MAP_SIZE
*sizeof(uint16_t))
195 for(j
=0; j
<REORDER_BUFFER_SIZE
; j
++){
201 h
= s
->mb_height
* 16;
202 shift
= (i
== 0) ?
0 : 1;
203 c_size
= (w
>> shift
) * (h
>> shift
);
205 CHECKED_ALLOCZ(pict
, c_size
);
206 s
->picture_buffer
[j
][i
] = pict
;
211 if(s
->codec_id
==CODEC_ID_MPEG4
){
212 CHECKED_ALLOCZ(s
->tex_pb_buffer
, PB_BUFFER_SIZE
);
213 CHECKED_ALLOCZ( s
->pb2_buffer
, PB_BUFFER_SIZE
);
217 if (s
->out_format
== FMT_H263
|| s
->encoding
) {
219 /* Allocate MB type table */
220 CHECKED_ALLOCZ(s
->mb_type
, s
->mb_num
* sizeof(UINT8
))
223 size
= (2 * s
->mb_width
+ 2) * (2 * s
->mb_height
+ 2);
224 CHECKED_ALLOCZ(s
->motion_val
, size
* 2 * sizeof(INT16
));
227 if (s
->h263_pred
|| s
->h263_plus
) {
228 int y_size
, c_size
, i
, size
;
232 y_size
= (2 * s
->mb_width
+ 2) * (2 * s
->mb_height
+ 2);
233 c_size
= (s
->mb_width
+ 2) * (s
->mb_height
+ 2);
234 size
= y_size
+ 2 * c_size
;
235 CHECKED_ALLOCZ(s
->dc_val
[0], size
* sizeof(INT16
));
236 s
->dc_val
[1] = s
->dc_val
[0] + y_size
;
237 s
->dc_val
[2] = s
->dc_val
[1] + c_size
;
239 s
->dc_val
[0][i
] = 1024;
242 CHECKED_ALLOCZ(s
->ac_val
[0], size
* sizeof(INT16
) * 16);
243 s
->ac_val
[1] = s
->ac_val
[0] + y_size
;
244 s
->ac_val
[2] = s
->ac_val
[1] + c_size
;
247 CHECKED_ALLOCZ(s
->coded_block
, y_size
);
249 /* which mb is a intra block */
250 CHECKED_ALLOCZ(s
->mbintra_table
, s
->mb_num
);
251 memset(s
->mbintra_table
, 1, s
->mb_num
);
253 /* divx501 bitstream reorder buffer */
254 CHECKED_ALLOCZ(s
->bitstream_buffer
, BITSTREAM_BUFFER_SIZE
);
256 /* cbp, ac_pred, pred_dir */
257 CHECKED_ALLOCZ(s
->cbp_table
, s
->mb_num
* sizeof(UINT8
))
258 CHECKED_ALLOCZ(s
->pred_dir_table
, s
->mb_num
* sizeof(UINT8
))
260 CHECKED_ALLOCZ(s
->qscale_table
, s
->mb_num
* sizeof(UINT8
))
262 /* default structure is frame */
263 s
->picture_structure
= PICT_FRAME
;
265 /* init macroblock skip table */
266 CHECKED_ALLOCZ(s
->mbskip_table
, s
->mb_num
);
268 s
->block
= s
->blocks
[0];
270 s
->context_initialized
= 1;
280 /* init common structure for both encoder and decoder */
281 void MPV_common_end(MpegEncContext
*s
)
285 av_freep(&s
->mb_type
);
286 av_freep(&s
->mb_var
);
287 av_freep(&s
->mc_mb_var
);
288 av_freep(&s
->p_mv_table
);
289 av_freep(&s
->b_forw_mv_table
);
290 av_freep(&s
->b_back_mv_table
);
291 av_freep(&s
->b_bidir_forw_mv_table
);
292 av_freep(&s
->b_bidir_back_mv_table
);
293 av_freep(&s
->b_direct_forw_mv_table
);
294 av_freep(&s
->b_direct_back_mv_table
);
295 av_freep(&s
->b_direct_mv_table
);
296 av_freep(&s
->motion_val
);
297 av_freep(&s
->dc_val
[0]);
298 av_freep(&s
->ac_val
[0]);
299 av_freep(&s
->coded_block
);
300 av_freep(&s
->mbintra_table
);
301 av_freep(&s
->cbp_table
);
302 av_freep(&s
->pred_dir_table
);
303 av_freep(&s
->qscale_table
);
304 av_freep(&s
->me_scratchpad
);
305 av_freep(&s
->me_map
);
306 av_freep(&s
->me_score_map
);
308 av_freep(&s
->mbskip_table
);
309 av_freep(&s
->bitstream_buffer
);
310 av_freep(&s
->tex_pb_buffer
);
311 av_freep(&s
->pb2_buffer
);
314 av_freep(&s
->last_picture_base
[i
]);
315 av_freep(&s
->next_picture_base
[i
]);
316 av_freep(&s
->aux_picture_base
[i
]);
317 for(j
=0; j
<REORDER_BUFFER_SIZE
; j
++){
318 av_freep(&s
->picture_buffer
[j
][i
]);
321 s
->context_initialized
= 0;
324 /* init video encoder */
325 int MPV_encode_init(AVCodecContext
*avctx
)
327 MpegEncContext
*s
= avctx
->priv_data
;
330 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
332 s
->bit_rate
= avctx
->bit_rate
;
333 s
->bit_rate_tolerance
= avctx
->bit_rate_tolerance
;
334 s
->frame_rate
= avctx
->frame_rate
;
335 s
->width
= avctx
->width
;
336 s
->height
= avctx
->height
;
337 if(avctx
->gop_size
> 600){
338 fprintf(stderr
, "Warning keyframe interval too large! reducing it ...\n");
341 s
->gop_size
= avctx
->gop_size
;
342 s
->rtp_mode
= avctx
->rtp_mode
;
343 s
->rtp_payload_size
= avctx
->rtp_payload_size
;
344 if (avctx
->rtp_callback
)
345 s
->rtp_callback
= avctx
->rtp_callback
;
346 s
->qmin
= avctx
->qmin
;
347 s
->qmax
= avctx
->qmax
;
348 s
->max_qdiff
= avctx
->max_qdiff
;
349 s
->qcompress
= avctx
->qcompress
;
350 s
->qblur
= avctx
->qblur
;
351 s
->b_quant_factor
= avctx
->b_quant_factor
;
352 s
->b_quant_offset
= avctx
->b_quant_offset
;
354 s
->aspect_ratio_info
= avctx
->aspect_ratio_info
;
355 s
->flags
= avctx
->flags
;
356 s
->max_b_frames
= avctx
->max_b_frames
;
357 s
->rc_strategy
= avctx
->rc_strategy
;
358 s
->b_frame_strategy
= avctx
->b_frame_strategy
;
359 s
->codec_id
= avctx
->codec
->id
;
360 s
->luma_elim_threshold
= avctx
->luma_elim_threshold
;
361 s
->chroma_elim_threshold
= avctx
->chroma_elim_threshold
;
362 s
->strict_std_compliance
= avctx
->strict_std_compliance
;
363 s
->data_partitioning
= avctx
->flags
& CODEC_FLAG_PART
;
365 if (s
->gop_size
<= 1) {
373 if (avctx
->me_method
== 0)
374 /* For compatibility */
375 s
->me_method
= motion_estimation_method
;
377 s
->me_method
= avctx
->me_method
;
380 s
->fixed_qscale
= (avctx
->flags
& CODEC_FLAG_QSCALE
);
382 switch(avctx
->codec
->id
) {
383 case CODEC_ID_MPEG1VIDEO
:
384 s
->out_format
= FMT_MPEG1
;
385 avctx
->delay
=0; //FIXME not sure, should check the spec
388 s
->out_format
= FMT_MJPEG
;
389 s
->intra_only
= 1; /* force intra only for jpeg */
390 s
->mjpeg_write_tables
= 1; /* write all tables */
391 s
->mjpeg_data_only_frames
= 0; /* write all the needed headers */
392 s
->mjpeg_vsample
[0] = 2; /* set up default sampling factors */
393 s
->mjpeg_vsample
[1] = 1; /* the only currently supported values */
394 s
->mjpeg_vsample
[2] = 1;
395 s
->mjpeg_hsample
[0] = 2;
396 s
->mjpeg_hsample
[1] = 1;
397 s
->mjpeg_hsample
[2] = 1;
398 if (mjpeg_init(s
) < 0)
403 if (h263_get_picture_format(s
->width
, s
->height
) == 7) {
404 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
407 s
->out_format
= FMT_H263
;
411 s
->out_format
= FMT_H263
;
413 s
->rtp_payload_size
= 1200;
415 s
->unrestricted_mv
= 1;
418 /* These are just to be sure */
424 s
->out_format
= FMT_H263
;
429 s
->out_format
= FMT_H263
;
431 s
->unrestricted_mv
= 1;
432 s
->has_b_frames
= s
->max_b_frames ?
1 : 0;
434 avctx
->delay
= s
->low_delay ?
0 : (s
->max_b_frames
+ 1);
436 case CODEC_ID_MSMPEG4V1
:
437 s
->out_format
= FMT_H263
;
440 s
->unrestricted_mv
= 1;
441 s
->msmpeg4_version
= 1;
444 case CODEC_ID_MSMPEG4V2
:
445 s
->out_format
= FMT_H263
;
448 s
->unrestricted_mv
= 1;
449 s
->msmpeg4_version
= 2;
452 case CODEC_ID_MSMPEG4V3
:
453 s
->out_format
= FMT_H263
;
456 s
->unrestricted_mv
= 1;
457 s
->msmpeg4_version
= 3;
464 { /* set up some save defaults, some codecs might override them later */
469 memset(default_mv_penalty
, 0, sizeof(UINT16
)*(MAX_FCODE
+1)*(2*MAX_MV
+1));
470 memset(default_fcode_tab
, 0, sizeof(UINT8
)*(2*MAX_MV
+1));
472 for(i
=-16; i
<16; i
++){
473 default_fcode_tab
[i
+ MAX_MV
]= 1;
477 s
->mv_penalty
= default_mv_penalty
;
478 s
->fcode_tab
= default_fcode_tab
;
480 if (s
->out_format
== FMT_H263
)
482 else if (s
->out_format
== FMT_MPEG1
)
483 mpeg1_encode_init(s
);
485 /* dont use mv_penalty table for crap MV as it would be confused */
486 if (s
->me_method
< ME_EPZS
) s
->mv_penalty
= default_mv_penalty
;
491 if (MPV_common_init(s
) < 0)
494 /* init default q matrix */
496 if(s
->out_format
== FMT_H263
)
497 s
->intra_matrix
[i
] = default_non_intra_matrix
[i
];
499 s
->intra_matrix
[i
] = default_intra_matrix
[i
];
501 s
->inter_matrix
[i
] = default_non_intra_matrix
[i
];
504 /* precompute matrix */
505 /* for mjpeg, we do include qscale in the matrix */
506 if (s
->out_format
!= FMT_MJPEG
) {
507 convert_matrix(s
->q_intra_matrix
, s
->q_intra_matrix16
, s
->q_intra_matrix16_bias
,
508 s
->intra_matrix
, s
->intra_quant_bias
);
509 convert_matrix(s
->q_inter_matrix
, s
->q_inter_matrix16
, s
->q_inter_matrix16_bias
,
510 s
->inter_matrix
, s
->inter_quant_bias
);
513 if(ff_rate_control_init(s
) < 0)
516 s
->picture_number
= 0;
517 s
->picture_in_gop_number
= 0;
518 s
->fake_picture_number
= 0;
519 /* motion detector init */
526 int MPV_encode_end(AVCodecContext
*avctx
)
528 MpegEncContext
*s
= avctx
->priv_data
;
534 ff_rate_control_uninit(s
);
537 if (s
->out_format
== FMT_MJPEG
)
543 /* draw the edges of width 'w' of an image of size width, height */
544 static void draw_edges_c(UINT8
*buf
, int wrap
, int width
, int height
, int w
)
546 UINT8
*ptr
, *last_line
;
549 last_line
= buf
+ (height
- 1) * wrap
;
552 memcpy(buf
- (i
+ 1) * wrap
, buf
, width
);
553 memcpy(last_line
+ (i
+ 1) * wrap
, last_line
, width
);
557 for(i
=0;i
<height
;i
++) {
558 memset(ptr
- w
, ptr
[0], w
);
559 memset(ptr
+ width
, ptr
[width
-1], w
);
564 memset(buf
- (i
+ 1) * wrap
- w
, buf
[0], w
); /* top left */
565 memset(buf
- (i
+ 1) * wrap
+ width
, buf
[width
-1], w
); /* top right */
566 memset(last_line
+ (i
+ 1) * wrap
- w
, last_line
[0], w
); /* top left */
567 memset(last_line
+ (i
+ 1) * wrap
+ width
, last_line
[width
-1], w
); /* top right */
571 /* generic function for encode/decode called before a frame is coded/decoded */
572 void MPV_frame_start(MpegEncContext
*s
)
580 if (s
->pict_type
== B_TYPE
) {
582 s
->current_picture
[i
] = s
->aux_picture
[i
];
586 /* swap next and last */
587 tmp
= s
->last_picture
[i
];
588 s
->last_picture
[i
] = s
->next_picture
[i
];
589 s
->next_picture
[i
] = tmp
;
590 s
->current_picture
[i
] = tmp
;
595 /* generic function for encode/decode called after a frame has been coded/decoded */
596 void MPV_frame_end(MpegEncContext
*s
)
598 // if((s->picture_number%100)==0 && s->encoding) printf("sads:%d //\n", sads);
600 /* draw edge for correct motion prediction if outside */
601 if (s
->pict_type
!= B_TYPE
&& !s
->intra_only
) {
602 if(s
->avctx
==NULL
|| s
->avctx
->codec
->id
!=CODEC_ID_MPEG4
|| s
->divx_version
>=500){
603 draw_edges(s
->current_picture
[0], s
->linesize
, s
->mb_width
*16, s
->mb_height
*16, EDGE_WIDTH
);
604 draw_edges(s
->current_picture
[1], s
->linesize
/2, s
->mb_width
*8, s
->mb_height
*8, EDGE_WIDTH
/2);
605 draw_edges(s
->current_picture
[2], s
->linesize
/2, s
->mb_width
*8, s
->mb_height
*8, EDGE_WIDTH
/2);
607 /* mpeg4? / opendivx / xvid */
608 draw_edges(s
->current_picture
[0], s
->linesize
, s
->width
, s
->height
, EDGE_WIDTH
);
609 draw_edges(s
->current_picture
[1], s
->linesize
/2, s
->width
/2, s
->height
/2, EDGE_WIDTH
/2);
610 draw_edges(s
->current_picture
[2], s
->linesize
/2, s
->width
/2, s
->height
/2, EDGE_WIDTH
/2);
615 if(s
->pict_type
!=B_TYPE
){
616 s
->last_non_b_pict_type
= s
->pict_type
;
617 s
->last_non_b_qscale
= s
->qscale
;
618 s
->last_non_b_mc_mb_var
= s
->mc_mb_var_sum
;
619 s
->num_available_buffers
++;
620 if(s
->num_available_buffers
>2) s
->num_available_buffers
= 2;
624 /* reorder input for encoding */
625 void reorder_input(MpegEncContext
*s
, AVPicture
*pict
)
629 if(s
->max_b_frames
> FF_MAX_B_FRAMES
) s
->max_b_frames
= FF_MAX_B_FRAMES
;
631 // delay= s->max_b_frames+1; (or 0 if no b frames cuz decoder diff)
633 for(j
=0; j
<REORDER_BUFFER_SIZE
-1; j
++){
634 s
->coded_order
[j
]= s
->coded_order
[j
+1];
636 s
->coded_order
[j
].picture
[0]= s
->coded_order
[j
].picture
[1]= s
->coded_order
[j
].picture
[2]= NULL
; //catch uninitalized buffers
637 s
->coded_order
[j
].pict_type
=0;
639 switch(s
->input_pict_type
){
644 index
= s
->max_b_frames
- s
->b_frames_since_non_b
;
645 s
->b_frames_since_non_b
=0;
648 index
= s
->max_b_frames
+ 1;
649 s
->b_frames_since_non_b
++;
652 //printf("index:%d type:%d strides: %d %d\n", index, s->input_pict_type, pict->linesize[0], s->linesize);
653 if( (index
==0 || (s
->flags
&CODEC_FLAG_INPUT_PRESERVED
))
654 && pict
->linesize
[0] == s
->linesize
655 && pict
->linesize
[1] == s
->linesize
>>1
656 && pict
->linesize
[2] == s
->linesize
>>1){
659 s
->coded_order
[index
].picture
[i
]= pict
->data
[i
];
664 uint8_t *src
= pict
->data
[i
];
666 int src_wrap
= pict
->linesize
[i
];
667 int dest_wrap
= s
->linesize
;
671 if(index
==0) dest
= s
->last_picture
[i
]+16; //is current_picture indeed but the switch hapens after reordering
672 else dest
= s
->picture_buffer
[s
->picture_buffer_index
][i
];
680 s
->coded_order
[index
].picture
[i
]= dest
;
682 memcpy(dest
, src
, w
);
688 s
->picture_buffer_index
++;
689 if(s
->picture_buffer_index
>= REORDER_BUFFER_SIZE
-1) s
->picture_buffer_index
=0;
692 s
->coded_order
[index
].pict_type
= s
->input_pict_type
;
693 s
->coded_order
[index
].qscale
= s
->input_qscale
;
694 s
->coded_order
[index
].force_type
= s
->force_input_type
;
695 s
->coded_order
[index
].picture_in_gop_number
= s
->input_picture_in_gop_number
;
696 s
->coded_order
[index
].picture_number
= s
->input_picture_number
;
699 s
->new_picture
[i
]= s
->coded_order
[0].picture
[i
];
703 int MPV_encode_picture(AVCodecContext
*avctx
,
704 unsigned char *buf
, int buf_size
, void *data
)
706 MpegEncContext
*s
= avctx
->priv_data
;
707 AVPicture
*pict
= data
;
709 s
->input_qscale
= avctx
->quality
;
711 init_put_bits(&s
->pb
, buf
, buf_size
, NULL
, NULL
);
713 if(avctx
->flags
&CODEC_FLAG_TYPE
){
715 s
->force_input_type
= avctx
->key_frame ? I_TYPE
: P_TYPE
;
716 }else if(s
->flags
&CODEC_FLAG_PASS2
){
718 s
->force_input_type
= s
->rc_context
.entry
[s
->input_picture_number
].new_pict_type
;
720 s
->force_input_type
=0;
721 if (!s
->intra_only
) {
722 /* first picture of GOP is intra */
723 if (s
->input_picture_in_gop_number
% s
->gop_size
==0){
724 s
->input_pict_type
= I_TYPE
;
725 }else if(s
->max_b_frames
==0){
726 s
->input_pict_type
= P_TYPE
;
728 if(s
->b_frames_since_non_b
< s
->max_b_frames
) //FIXME more IQ
729 s
->input_pict_type
= B_TYPE
;
731 s
->input_pict_type
= P_TYPE
;
734 s
->input_pict_type
= I_TYPE
;
738 if(s
->input_pict_type
==I_TYPE
)
739 s
->input_picture_in_gop_number
=0;
741 reorder_input(s
, pict
);
744 if(s
->coded_order
[0].picture
[0]){
746 s
->pict_type
= s
->coded_order
[0].pict_type
;
747 if (s
->fixed_qscale
) /* the ratecontrol needs the last qscale so we dont touch it for CBR */
748 s
->qscale
= s
->coded_order
[0].qscale
;
749 s
->force_type
= s
->coded_order
[0].force_type
;
750 s
->picture_in_gop_number
= s
->coded_order
[0].picture_in_gop_number
;
751 s
->picture_number
= s
->coded_order
[0].picture_number
;
755 encode_picture(s
, s
->picture_number
);
756 avctx
->key_frame
= (s
->pict_type
== I_TYPE
);
757 avctx
->pict_type
= s
->pict_type
;
758 avctx
->real_pict_num
= s
->picture_number
;
759 avctx
->header_bits
= s
->header_bits
;
760 avctx
->mv_bits
= s
->mv_bits
;
761 avctx
->misc_bits
= s
->misc_bits
;
762 avctx
->i_tex_bits
= s
->i_tex_bits
;
763 avctx
->p_tex_bits
= s
->p_tex_bits
;
764 avctx
->i_count
= s
->i_count
;
765 avctx
->p_count
= s
->p_count
;
766 avctx
->skip_count
= s
->skip_count
;
770 if (s
->out_format
== FMT_MJPEG
)
771 mjpeg_picture_trailer(s
);
773 avctx
->quality
= s
->qscale
;
775 if(s
->flags
&CODEC_FLAG_PASS1
)
776 ff_write_pass1_stats(s
);
780 s
->input_picture_number
++;
781 s
->input_picture_in_gop_number
++;
783 flush_put_bits(&s
->pb
);
784 s
->frame_bits
= (pbBufPtr(&s
->pb
) - s
->pb
.buf
) * 8;
785 if(s
->pict_type
==B_TYPE
) s
->pb_frame_bits
+= s
->frame_bits
;
786 else s
->pb_frame_bits
= s
->frame_bits
;
788 s
->total_bits
+= s
->frame_bits
;
789 avctx
->frame_bits
= s
->frame_bits
;
790 //printf("fcode: %d, type: %d, head: %d, mv: %d, misc: %d, frame: %d, itex: %d, ptex: %d\n",
791 //s->f_code, avctx->key_frame, s->header_bits, s->mv_bits, s->misc_bits, s->frame_bits, s->i_tex_bits, s->p_tex_bits);
793 if (avctx
->get_psnr
) {
794 /* At this point pict->data should have the original frame */
795 /* an s->current_picture should have the coded/decoded frame */
796 get_psnr(pict
->data
, s
->current_picture
,
797 pict
->linesize
, s
->linesize
, avctx
);
798 // printf("%f\n", avctx->psnr_y);
800 return pbBufPtr(&s
->pb
) - s
->pb
.buf
;
803 static inline void gmc1_motion(MpegEncContext
*s
,
804 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
806 UINT8
**ref_picture
, int src_offset
,
810 int offset
, src_x
, src_y
, linesize
;
811 int motion_x
, motion_y
;
813 if(s
->real_sprite_warping_points
>1) printf("more than 1 warp point isnt supported\n");
814 motion_x
= s
->sprite_offset
[0][0];
815 motion_y
= s
->sprite_offset
[0][1];
816 src_x
= s
->mb_x
* 16 + (motion_x
>> (s
->sprite_warping_accuracy
+1));
817 src_y
= s
->mb_y
* 16 + (motion_y
>> (s
->sprite_warping_accuracy
+1));
818 motion_x
<<=(3-s
->sprite_warping_accuracy
);
819 motion_y
<<=(3-s
->sprite_warping_accuracy
);
820 src_x
= clip(src_x
, -16, s
->width
);
821 if (src_x
== s
->width
)
823 src_y
= clip(src_y
, -16, s
->height
);
824 if (src_y
== s
->height
)
827 linesize
= s
->linesize
;
828 ptr
= ref_picture
[0] + (src_y
* linesize
) + src_x
+ src_offset
;
831 gmc1(dest_y
, ptr
, linesize
, h
, motion_x
&15, motion_y
&15, s
->no_rounding
);
832 gmc1(dest_y
+8, ptr
+8, linesize
, h
, motion_x
&15, motion_y
&15, s
->no_rounding
);
834 motion_x
= s
->sprite_offset
[1][0];
835 motion_y
= s
->sprite_offset
[1][1];
836 src_x
= s
->mb_x
* 8 + (motion_x
>> (s
->sprite_warping_accuracy
+1));
837 src_y
= s
->mb_y
* 8 + (motion_y
>> (s
->sprite_warping_accuracy
+1));
838 motion_x
<<=(3-s
->sprite_warping_accuracy
);
839 motion_y
<<=(3-s
->sprite_warping_accuracy
);
840 src_x
= clip(src_x
, -8, s
->width
>>1);
841 if (src_x
== s
->width
>>1)
843 src_y
= clip(src_y
, -8, s
->height
>>1);
844 if (src_y
== s
->height
>>1)
847 offset
= (src_y
* linesize
>>1) + src_x
+ (src_offset
>>1);
848 ptr
= ref_picture
[1] + offset
;
849 gmc1(dest_cb
+ (dest_offset
>>1), ptr
, linesize
>>1, h
>>1, motion_x
&15, motion_y
&15, s
->no_rounding
);
850 ptr
= ref_picture
[2] + offset
;
851 gmc1(dest_cr
+ (dest_offset
>>1), ptr
, linesize
>>1, h
>>1, motion_x
&15, motion_y
&15, s
->no_rounding
);
856 /* apply one mpeg motion vector to the three components */
857 static inline void mpeg_motion(MpegEncContext
*s
,
858 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
860 UINT8
**ref_picture
, int src_offset
,
861 int field_based
, op_pixels_func
*pix_op
,
862 int motion_x
, int motion_y
, int h
)
865 int dxy
, offset
, mx
, my
, src_x
, src_y
, height
, linesize
;
866 if(s
->quarter_sample
)
871 dxy
= ((motion_y
& 1) << 1) | (motion_x
& 1);
872 src_x
= s
->mb_x
* 16 + (motion_x
>> 1);
873 src_y
= s
->mb_y
* (16 >> field_based
) + (motion_y
>> 1);
875 /* WARNING: do no forget half pels */
876 height
= s
->height
>> field_based
;
877 src_x
= clip(src_x
, -16, s
->width
);
878 if (src_x
== s
->width
)
880 src_y
= clip(src_y
, -16, height
);
883 linesize
= s
->linesize
<< field_based
;
884 ptr
= ref_picture
[0] + (src_y
* linesize
) + (src_x
) + src_offset
;
885 dest_y
+= dest_offset
;
886 pix_op
[dxy
](dest_y
, ptr
, linesize
, h
);
887 pix_op
[dxy
](dest_y
+ 8, ptr
+ 8, linesize
, h
);
889 if (s
->out_format
== FMT_H263
) {
891 if ((motion_x
& 3) != 0)
893 if ((motion_y
& 3) != 0)
900 dxy
= ((my
& 1) << 1) | (mx
& 1);
905 src_x
= s
->mb_x
* 8 + mx
;
906 src_y
= s
->mb_y
* (8 >> field_based
) + my
;
907 src_x
= clip(src_x
, -8, s
->width
>> 1);
908 if (src_x
== (s
->width
>> 1))
910 src_y
= clip(src_y
, -8, height
>> 1);
911 if (src_y
== (height
>> 1))
914 offset
= (src_y
* (linesize
>> 1)) + src_x
+ (src_offset
>> 1);
915 ptr
= ref_picture
[1] + offset
;
916 pix_op
[dxy
](dest_cb
+ (dest_offset
>> 1), ptr
, linesize
>> 1, h
>> 1);
917 ptr
= ref_picture
[2] + offset
;
918 pix_op
[dxy
](dest_cr
+ (dest_offset
>> 1), ptr
, linesize
>> 1, h
>> 1);
921 static inline void qpel_motion(MpegEncContext
*s
,
922 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
924 UINT8
**ref_picture
, int src_offset
,
925 int field_based
, op_pixels_func
*pix_op
,
926 qpel_mc_func
*qpix_op
,
927 int motion_x
, int motion_y
, int h
)
930 int dxy
, offset
, mx
, my
, src_x
, src_y
, height
, linesize
;
932 dxy
= ((motion_y
& 3) << 2) | (motion_x
& 3);
933 src_x
= s
->mb_x
* 16 + (motion_x
>> 2);
934 src_y
= s
->mb_y
* (16 >> field_based
) + (motion_y
>> 2);
936 height
= s
->height
>> field_based
;
937 src_x
= clip(src_x
, -16, s
->width
);
938 if (src_x
== s
->width
)
940 src_y
= clip(src_y
, -16, height
);
943 linesize
= s
->linesize
<< field_based
;
944 ptr
= ref_picture
[0] + (src_y
* linesize
) + src_x
+ src_offset
;
945 dest_y
+= dest_offset
;
946 //printf("%d %d %d\n", src_x, src_y, dxy);
947 qpix_op
[dxy
](dest_y
, ptr
, linesize
, linesize
, motion_x
&3, motion_y
&3);
948 qpix_op
[dxy
](dest_y
+ 8, ptr
+ 8, linesize
, linesize
, motion_x
&3, motion_y
&3);
949 qpix_op
[dxy
](dest_y
+ linesize
*8 , ptr
+ linesize
*8 , linesize
, linesize
, motion_x
&3, motion_y
&3);
950 qpix_op
[dxy
](dest_y
+ linesize
*8 + 8, ptr
+ linesize
*8 + 8, linesize
, linesize
, motion_x
&3, motion_y
&3);
952 mx
= (motion_x
>>1) | (motion_x
&1);
953 my
= (motion_y
>>1) | (motion_y
&1);
963 src_x
= s
->mb_x
* 8 + mx
;
964 src_y
= s
->mb_y
* (8 >> field_based
) + my
;
965 src_x
= clip(src_x
, -8, s
->width
>> 1);
966 if (src_x
== (s
->width
>> 1))
968 src_y
= clip(src_y
, -8, height
>> 1);
969 if (src_y
== (height
>> 1))
972 offset
= (src_y
* (linesize
>> 1)) + src_x
+ (src_offset
>> 1);
973 ptr
= ref_picture
[1] + offset
;
974 pix_op
[dxy
](dest_cb
+ (dest_offset
>> 1), ptr
, linesize
>> 1, h
>> 1);
975 ptr
= ref_picture
[2] + offset
;
976 pix_op
[dxy
](dest_cr
+ (dest_offset
>> 1), ptr
, linesize
>> 1, h
>> 1);
980 static inline void MPV_motion(MpegEncContext
*s
,
981 UINT8
*dest_y
, UINT8
*dest_cb
, UINT8
*dest_cr
,
982 int dir
, UINT8
**ref_picture
,
983 op_pixels_func
*pix_op
, qpel_mc_func
*qpix_op
)
985 int dxy
, offset
, mx
, my
, src_x
, src_y
, motion_x
, motion_y
;
996 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
999 s
->sprite_offset
[0][0]>>3,
1000 s
->sprite_offset
[0][1]>>3,
1003 gmc1_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1007 }else if(s
->quarter_sample
&& dir
==0){ //FIXME
1008 qpel_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1011 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 16);
1013 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1016 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 16);
1021 motion_x
= s
->mv
[dir
][i
][0];
1022 motion_y
= s
->mv
[dir
][i
][1];
1024 dxy
= ((motion_y
& 1) << 1) | (motion_x
& 1);
1025 src_x
= mb_x
* 16 + (motion_x
>> 1) + (i
& 1) * 8;
1026 src_y
= mb_y
* 16 + (motion_y
>> 1) + (i
>>1) * 8;
1028 /* WARNING: do no forget half pels */
1029 src_x
= clip(src_x
, -16, s
->width
);
1030 if (src_x
== s
->width
)
1032 src_y
= clip(src_y
, -16, s
->height
);
1033 if (src_y
== s
->height
)
1036 ptr
= ref_picture
[0] + (src_y
* s
->linesize
) + (src_x
);
1037 dest
= dest_y
+ ((i
& 1) * 8) + (i
>> 1) * 8 * s
->linesize
;
1038 pix_op
[dxy
](dest
, ptr
, s
->linesize
, 8);
1040 /* In case of 8X8, we construct a single chroma motion vector
1041 with a special rounding */
1045 mx
+= s
->mv
[dir
][i
][0];
1046 my
+= s
->mv
[dir
][i
][1];
1049 mx
= (h263_chroma_roundtab
[mx
& 0xf] + ((mx
>> 3) & ~1));
1052 mx
= -(h263_chroma_roundtab
[mx
& 0xf] + ((mx
>> 3) & ~1));
1055 my
= (h263_chroma_roundtab
[my
& 0xf] + ((my
>> 3) & ~1));
1058 my
= -(h263_chroma_roundtab
[my
& 0xf] + ((my
>> 3) & ~1));
1060 dxy
= ((my
& 1) << 1) | (mx
& 1);
1064 src_x
= mb_x
* 8 + mx
;
1065 src_y
= mb_y
* 8 + my
;
1066 src_x
= clip(src_x
, -8, s
->width
/2);
1067 if (src_x
== s
->width
/2)
1069 src_y
= clip(src_y
, -8, s
->height
/2);
1070 if (src_y
== s
->height
/2)
1073 offset
= (src_y
* (s
->linesize
>> 1)) + src_x
;
1074 ptr
= ref_picture
[1] + offset
;
1075 pix_op
[dxy
](dest_cb
, ptr
, s
->linesize
>> 1, 8);
1076 ptr
= ref_picture
[2] + offset
;
1077 pix_op
[dxy
](dest_cr
, ptr
, s
->linesize
>> 1, 8);
1080 if (s
->picture_structure
== PICT_FRAME
) {
1082 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
1083 ref_picture
, s
->field_select
[dir
][0] ? s
->linesize
: 0,
1085 s
->mv
[dir
][0][0], s
->mv
[dir
][0][1], 8);
1087 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, s
->linesize
,
1088 ref_picture
, s
->field_select
[dir
][1] ? s
->linesize
: 0,
1090 s
->mv
[dir
][1][0], s
->mv
[dir
][1][1], 8);
1100 /* put block[] to dest[] */
1101 static inline void put_dct(MpegEncContext
*s
,
1102 DCTELEM
*block
, int i
, UINT8
*dest
, int line_size
)
1105 s
->dct_unquantize(s
, block
, i
, s
->qscale
);
1107 put_pixels_clamped(block
, dest
, line_size
);
1110 /* add block[] to dest[] */
1111 static inline void add_dct(MpegEncContext
*s
,
1112 DCTELEM
*block
, int i
, UINT8
*dest
, int line_size
)
1114 /* skip dequant / idct if we are really late ;) */
1115 if(s
->hurry_up
>1) return;
1117 if (s
->block_last_index
[i
] >= 0) {
1119 if(s
->encoding
|| (!s
->h263_msmpeg4
))
1120 s
->dct_unquantize(s
, block
, i
, s
->qscale
);
1123 add_pixels_clamped(block
, dest
, line_size
);
1128 * cleans dc, ac, coded_block for the current non intra MB
1130 void ff_clean_intra_table_entries(MpegEncContext
*s
)
1132 int wrap
= s
->block_wrap
[0];
1133 int xy
= s
->block_index
[0];
1136 s
->dc_val
[0][xy
+ 1 ] =
1137 s
->dc_val
[0][xy
+ wrap
] =
1138 s
->dc_val
[0][xy
+ 1 + wrap
] = 1024;
1140 memset(s
->ac_val
[0][xy
], 0, 32 * sizeof(INT16
));
1141 memset(s
->ac_val
[0][xy
+ wrap
], 0, 32 * sizeof(INT16
));
1142 if (s
->msmpeg4_version
>=3) {
1143 s
->coded_block
[xy
] =
1144 s
->coded_block
[xy
+ 1 ] =
1145 s
->coded_block
[xy
+ wrap
] =
1146 s
->coded_block
[xy
+ 1 + wrap
] = 0;
1149 wrap
= s
->block_wrap
[4];
1150 xy
= s
->mb_x
+ 1 + (s
->mb_y
+ 1) * wrap
;
1152 s
->dc_val
[2][xy
] = 1024;
1154 memset(s
->ac_val
[1][xy
], 0, 16 * sizeof(INT16
));
1155 memset(s
->ac_val
[2][xy
], 0, 16 * sizeof(INT16
));
1157 s
->mbintra_table
[s
->mb_x
+ s
->mb_y
*s
->mb_width
]= 0;
1160 /* generic function called after a macroblock has been parsed by the
1161 decoder or after it has been encoded by the encoder.
1163 Important variables used:
1164 s->mb_intra : true if intra macroblock
1165 s->mv_dir : motion vector direction
1166 s->mv_type : motion vector type
1167 s->mv : motion vector
1168 s->interlaced_dct : true if interlaced dct used (mpeg2)
1170 void MPV_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1173 int dct_linesize
, dct_offset
;
1174 op_pixels_func
*op_pix
;
1175 qpel_mc_func
*op_qpix
;
1180 #ifdef FF_POSTPROCESS
1181 /* Obsolete. Exists for compatibility with mplayer only. */
1182 quant_store
[mb_y
][mb_x
]=s
->qscale
;
1183 //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale);
1185 if(s
->avctx
->quant_store
) s
->avctx
->quant_store
[mb_y
*s
->avctx
->qstride
+mb_x
] = s
->qscale
;
1188 /* update DC predictors for P macroblocks */
1190 if (s
->h263_pred
|| s
->h263_aic
) {
1191 if(s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
])
1192 ff_clean_intra_table_entries(s
);
1196 s
->last_dc
[2] = 128 << s
->intra_dc_precision
;
1199 else if (s
->h263_pred
|| s
->h263_aic
)
1200 s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
]=1;
1202 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
1203 if (s
->out_format
== FMT_H263
) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
1204 if(s
->pict_type
!=B_TYPE
){
1205 int xy
, wrap
, motion_x
, motion_y
;
1207 wrap
= 2 * s
->mb_width
+ 2;
1208 xy
= 2 * mb_x
+ 1 + (2 * mb_y
+ 1) * wrap
;
1213 } else if (s
->mv_type
== MV_TYPE_16X16
) {
1214 motion_x
= s
->mv
[0][0][0];
1215 motion_y
= s
->mv
[0][0][1];
1217 /* no update if 8X8 because it has been done during parsing */
1218 s
->motion_val
[xy
][0] = motion_x
;
1219 s
->motion_val
[xy
][1] = motion_y
;
1220 s
->motion_val
[xy
+ 1][0] = motion_x
;
1221 s
->motion_val
[xy
+ 1][1] = motion_y
;
1222 s
->motion_val
[xy
+ wrap
][0] = motion_x
;
1223 s
->motion_val
[xy
+ wrap
][1] = motion_y
;
1224 s
->motion_val
[xy
+ 1 + wrap
][0] = motion_x
;
1225 s
->motion_val
[xy
+ 1 + wrap
][1] = motion_y
;
1230 if (!(s
->encoding
&& (s
->intra_only
|| s
->pict_type
==B_TYPE
))) {
1231 UINT8
*dest_y
, *dest_cb
, *dest_cr
;
1234 /* avoid copy if macroblock skipped in last frame too
1235 dont touch it for B-frames as they need the skip info from the next p-frame */
1236 if (s
->pict_type
!= B_TYPE
) {
1237 mbskip_ptr
= &s
->mbskip_table
[s
->mb_y
* s
->mb_width
+ s
->mb_x
];
1240 /* if previous was skipped too, then nothing to do !
1241 skip only during decoding as we might trash the buffers during encoding a bit */
1242 if (*mbskip_ptr
!= 0 && !s
->encoding
)
1244 *mbskip_ptr
= 1; /* indicate that this time we skiped it */
1246 *mbskip_ptr
= 0; /* not skipped */
1250 dest_y
= s
->current_picture
[0] + (mb_y
* 16 * s
->linesize
) + mb_x
* 16;
1251 dest_cb
= s
->current_picture
[1] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1252 dest_cr
= s
->current_picture
[2] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1254 if (s
->interlaced_dct
) {
1255 dct_linesize
= s
->linesize
* 2;
1256 dct_offset
= s
->linesize
;
1258 dct_linesize
= s
->linesize
;
1259 dct_offset
= s
->linesize
* 8;
1263 const int xy
= s
->mb_y
* s
->mb_width
+ s
->mb_x
;
1264 /* motion handling */
1265 /* decoding or more than one mb_type (MC was allready done otherwise) */
1266 if((!s
->encoding
) || (s
->mb_type
[xy
]&(s
->mb_type
[xy
]-1))){
1267 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
){
1268 op_pix
= put_pixels_tab
;
1269 op_qpix
= qpel_mc_rnd_tab
;
1271 op_pix
= put_no_rnd_pixels_tab
;
1272 op_qpix
= qpel_mc_no_rnd_tab
;
1275 if (s
->mv_dir
& MV_DIR_FORWARD
) {
1276 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 0, s
->last_picture
, op_pix
, op_qpix
);
1277 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
)
1278 op_pix
= avg_pixels_tab
;
1280 op_pix
= avg_no_rnd_pixels_tab
;
1282 if (s
->mv_dir
& MV_DIR_BACKWARD
) {
1283 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 1, s
->next_picture
, op_pix
, op_qpix
);
1287 /* add dct residue */
1288 add_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
1289 add_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
1290 add_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
1291 add_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
1293 add_dct(s
, block
[4], 4, dest_cb
, s
->linesize
>> 1);
1294 add_dct(s
, block
[5], 5, dest_cr
, s
->linesize
>> 1);
1296 /* dct only in intra block */
1297 put_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
1298 put_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
1299 put_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
1300 put_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
1302 put_dct(s
, block
[4], 4, dest_cb
, s
->linesize
>> 1);
1303 put_dct(s
, block
[5], 5, dest_cr
, s
->linesize
>> 1);
1307 emms_c(); //FIXME remove
1310 static inline void dct_single_coeff_elimination(MpegEncContext
*s
, int n
, int threshold
, int skip_dc
)
1312 static const char tab
[64]=
1324 DCTELEM
*block
= s
->block
[n
];
1325 const int last_index
= s
->block_last_index
[n
];
1327 if(skip_dc
) skip_dc
=1;
1329 /* are all which we could set to zero are allready zero? */
1330 if(last_index
<=skip_dc
- 1) return;
1332 for(i
=0; i
<=last_index
; i
++){
1333 const int j
= zigzag_direct
[i
];
1334 const int level
= ABS(block
[j
]);
1336 if(skip_dc
&& i
==0) continue;
1345 if(score
>= threshold
) return;
1346 for(i
=skip_dc
; i
<=last_index
; i
++){
1347 const int j
= zigzag_direct
[i
];
1350 if(block
[0]) s
->block_last_index
[n
]= 0;
1351 else s
->block_last_index
[n
]= -1;
1354 static inline void clip_coeffs(MpegEncContext
*s
, DCTELEM
*block
, int last_index
)
1357 const int maxlevel
= s
->max_qcoeff
;
1358 const int minlevel
= s
->min_qcoeff
;
1360 for(i
=0;i
<=last_index
; i
++){
1361 const int j
= zigzag_direct
[i
];
1362 int level
= block
[j
];
1364 if (level
>maxlevel
) level
=maxlevel
;
1365 else if(level
<minlevel
) level
=minlevel
;
1370 static void encode_mb(MpegEncContext
*s
, int motion_x
, int motion_y
)
1372 const int mb_x
= s
->mb_x
;
1373 const int mb_y
= s
->mb_y
;
1377 if (s
->interlaced_dct
) {
1378 dct_linesize
= s
->linesize
* 2;
1379 dct_offset
= s
->linesize
;
1381 dct_linesize
= s
->linesize
;
1382 dct_offset
= s
->linesize
* 8;
1385 for(i
=0; i
<6; i
++) skip_dct
[i
]=0;
1392 ptr
= s
->new_picture
[0] + (mb_y
* 16 * wrap
) + mb_x
* 16;
1393 get_pixels(s
->block
[0], ptr
, wrap
);
1394 get_pixels(s
->block
[1], ptr
+ 8, wrap
);
1395 get_pixels(s
->block
[2], ptr
+ 8 * wrap
, wrap
);
1396 get_pixels(s
->block
[3], ptr
+ 8 * wrap
+ 8, wrap
);
1399 ptr
= s
->new_picture
[1] + (mb_y
* 8 * wrap
) + mb_x
* 8;
1400 get_pixels(s
->block
[4], ptr
, wrap
);
1402 ptr
= s
->new_picture
[2] + (mb_y
* 8 * wrap
) + mb_x
* 8;
1403 get_pixels(s
->block
[5], ptr
, wrap
);
1405 op_pixels_func
*op_pix
;
1406 qpel_mc_func
*op_qpix
;
1407 UINT8
*dest_y
, *dest_cb
, *dest_cr
;
1408 UINT8
*ptr_y
, *ptr_cb
, *ptr_cr
;
1411 dest_y
= s
->current_picture
[0] + (mb_y
* 16 * s
->linesize
) + mb_x
* 16;
1412 dest_cb
= s
->current_picture
[1] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1413 dest_cr
= s
->current_picture
[2] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1414 wrap_y
= s
->linesize
;
1416 ptr_y
= s
->new_picture
[0] + (mb_y
* 16 * wrap_y
) + mb_x
* 16;
1417 ptr_cb
= s
->new_picture
[1] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
1418 ptr_cr
= s
->new_picture
[2] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
1420 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
){
1421 op_pix
= put_pixels_tab
;
1422 op_qpix
= qpel_mc_rnd_tab
;
1424 op_pix
= put_no_rnd_pixels_tab
;
1425 op_qpix
= qpel_mc_no_rnd_tab
;
1428 if (s
->mv_dir
& MV_DIR_FORWARD
) {
1429 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 0, s
->last_picture
, op_pix
, op_qpix
);
1430 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
)
1431 op_pix
= avg_pixels_tab
;
1433 op_pix
= avg_no_rnd_pixels_tab
;
1435 if (s
->mv_dir
& MV_DIR_BACKWARD
) {
1436 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 1, s
->next_picture
, op_pix
, op_qpix
);
1439 diff_pixels(s
->block
[0], ptr_y
, dest_y
, wrap_y
);
1440 diff_pixels(s
->block
[1], ptr_y
+ 8, dest_y
+ 8, wrap_y
);
1441 diff_pixels(s
->block
[2], ptr_y
+ 8 * wrap_y
, dest_y
+ 8 * wrap_y
, wrap_y
);
1442 diff_pixels(s
->block
[3], ptr_y
+ 8 * wrap_y
+ 8, dest_y
+ 8 * wrap_y
+ 8, wrap_y
);
1443 diff_pixels(s
->block
[4], ptr_cb
, dest_cb
, wrap_c
);
1444 diff_pixels(s
->block
[5], ptr_cr
, dest_cr
, wrap_c
);
1446 /* pre quantization */
1447 if(s
->mc_mb_var
[s
->mb_width
*mb_y
+ mb_x
]<2*s
->qscale
*s
->qscale
){
1448 if(pix_abs8x8(ptr_y
, dest_y
, wrap_y
) < 20*s
->qscale
) skip_dct
[0]= 1;
1449 if(pix_abs8x8(ptr_y
+ 8, dest_y
+ 8, wrap_y
) < 20*s
->qscale
) skip_dct
[1]= 1;
1450 if(pix_abs8x8(ptr_y
+ 8*wrap_y
, dest_y
+ 8*wrap_y
, wrap_y
) < 20*s
->qscale
) skip_dct
[2]= 1;
1451 if(pix_abs8x8(ptr_y
+ 8*wrap_y
+ 8, dest_y
+ 8*wrap_y
+ 8, wrap_y
) < 20*s
->qscale
) skip_dct
[3]= 1;
1452 if(pix_abs8x8(ptr_cb
, dest_cb
, wrap_y
) < 20*s
->qscale
) skip_dct
[4]= 1;
1453 if(pix_abs8x8(ptr_cr
, dest_cr
, wrap_y
) < 20*s
->qscale
) skip_dct
[5]= 1;
1459 if(skip_dct
[i
]) num
++;
1462 if(s
->mb_x
==0 && s
->mb_y
==0){
1464 printf("%6d %1d\n", stat
[i
], i
);
1477 adap_parm
= ((s
->avg_mb_var
<< 1) + s
->mb_var
[s
->mb_width
*mb_y
+mb_x
] + 1.0) /
1478 ((s
->mb_var
[s
->mb_width
*mb_y
+mb_x
] << 1) + s
->avg_mb_var
+ 1.0);
1480 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
1481 (s
->mb_type
[s
->mb_width
*mb_y
+mb_x
] > 0) ?
'I' : 'P',
1482 s
->qscale
, adap_parm
, s
->qscale
*adap_parm
,
1483 s
->mb_var
[s
->mb_width
*mb_y
+mb_x
], s
->avg_mb_var
);
1486 /* DCT & quantize */
1487 if (s
->h263_pred
&& !(s
->msmpeg4_version
==1 || s
->msmpeg4_version
==2)) {
1489 } else if (s
->h263_aic
) {
1490 s
->y_dc_scale
= 2*s
->qscale
;
1491 s
->c_dc_scale
= 2*s
->qscale
;
1493 /* default quantization values */
1497 if(s
->out_format
==FMT_MJPEG
){
1500 s
->block_last_index
[i
] = dct_quantize(s
, s
->block
[i
], i
, 8, &overflow
);
1501 if (overflow
) clip_coeffs(s
, s
->block
[i
], s
->block_last_index
[i
]);
1507 s
->block_last_index
[i
] = dct_quantize(s
, s
->block
[i
], i
, s
->qscale
, &overflow
);
1508 // FIXME we could decide to change to quantizer instead of clipping
1509 // JS: I don't think that would be a good idea it could lower quality instead
1510 // of improve it. Just INTRADC clipping deserves changes in quantizer
1511 if (overflow
) clip_coeffs(s
, s
->block
[i
], s
->block_last_index
[i
]);
1513 s
->block_last_index
[i
]= -1;
1515 if(s
->luma_elim_threshold
&& !s
->mb_intra
)
1517 dct_single_coeff_elimination(s
, i
, s
->luma_elim_threshold
, 0);
1518 if(s
->chroma_elim_threshold
&& !s
->mb_intra
)
1520 dct_single_coeff_elimination(s
, i
, s
->chroma_elim_threshold
, 1);
1523 /* huffman encode */
1524 switch(s
->out_format
) {
1526 mpeg1_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1529 if (s
->h263_msmpeg4
)
1530 msmpeg4_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1531 else if(s
->h263_pred
)
1532 mpeg4_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1534 h263_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1537 mjpeg_encode_mb(s
, s
->block
);
1542 void ff_copy_bits(PutBitContext
*pb
, UINT8
*src
, int length
)
1545 int bytes
= length
>>4;
1546 int bits
= length
&15;
1549 if(length
==0) return;
1551 for(i
=0; i
<bytes
; i
++) put_bits(pb
, 16, be2me_16(((uint16_t*)src
)[i
]));
1552 put_bits(pb
, bits
, be2me_16(((uint16_t*)src
)[i
])>>(16-bits
));
1554 int bytes
= length
>>3;
1558 for(i
=0; i
<bytes
; i
++) put_bits(pb
, 8, src
[i
]);
1559 put_bits(pb
, bits
, src
[i
]>>(8-bits
));
1563 static inline void copy_context_before_encode(MpegEncContext
*d
, MpegEncContext
*s
, int type
){
1566 memcpy(d
->last_mv
, s
->last_mv
, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
1569 d
->mb_incr
= s
->mb_incr
;
1571 d
->last_dc
[i
]= s
->last_dc
[i
];
1574 d
->mv_bits
= s
->mv_bits
;
1575 d
->i_tex_bits
= s
->i_tex_bits
;
1576 d
->p_tex_bits
= s
->p_tex_bits
;
1577 d
->i_count
= s
->i_count
;
1578 d
->p_count
= s
->p_count
;
1579 d
->skip_count
= s
->skip_count
;
1580 d
->misc_bits
= s
->misc_bits
;
1583 d
->mb_skiped
= s
->mb_skiped
;
1586 static inline void copy_context_after_encode(MpegEncContext
*d
, MpegEncContext
*s
, int type
){
1589 memcpy(d
->mv
, s
->mv
, 2*4*2*sizeof(int));
1590 memcpy(d
->last_mv
, s
->last_mv
, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
1593 d
->mb_incr
= s
->mb_incr
;
1595 d
->last_dc
[i
]= s
->last_dc
[i
];
1598 d
->mv_bits
= s
->mv_bits
;
1599 d
->i_tex_bits
= s
->i_tex_bits
;
1600 d
->p_tex_bits
= s
->p_tex_bits
;
1601 d
->i_count
= s
->i_count
;
1602 d
->p_count
= s
->p_count
;
1603 d
->skip_count
= s
->skip_count
;
1604 d
->misc_bits
= s
->misc_bits
;
1606 d
->mb_intra
= s
->mb_intra
;
1607 d
->mb_skiped
= s
->mb_skiped
;
1608 d
->mv_type
= s
->mv_type
;
1609 d
->mv_dir
= s
->mv_dir
;
1611 if(s
->data_partitioning
){
1613 d
->tex_pb
= s
->tex_pb
;
1617 d
->block_last_index
[i
]= s
->block_last_index
[i
];
1620 static inline void encode_mb_hq(MpegEncContext
*s
, MpegEncContext
*backup
, MpegEncContext
*best
, int type
,
1621 PutBitContext pb
[2], PutBitContext pb2
[2], PutBitContext tex_pb
[2],
1622 int *dmin
, int *next_block
, int motion_x
, int motion_y
)
1626 copy_context_before_encode(s
, backup
, type
);
1628 s
->block
= s
->blocks
[*next_block
];
1629 s
->pb
= pb
[*next_block
];
1630 if(s
->data_partitioning
){
1631 s
->pb2
= pb2
[*next_block
];
1632 s
->tex_pb
= tex_pb
[*next_block
];
1635 encode_mb(s
, motion_x
, motion_y
);
1637 bits_count
= get_bit_count(&s
->pb
);
1638 if(s
->data_partitioning
){
1639 bits_count
+= get_bit_count(&s
->pb2
);
1640 bits_count
+= get_bit_count(&s
->tex_pb
);
1643 if(bits_count
<*dmin
){
1647 copy_context_after_encode(best
, s
, type
);
1651 static void encode_picture(MpegEncContext
*s
, int picture_number
)
1653 int mb_x
, mb_y
, last_gob
, pdif
= 0;
1656 MpegEncContext best_s
, backup_s
;
1657 UINT8 bit_buf
[2][3000];
1658 UINT8 bit_buf2
[2][3000];
1659 UINT8 bit_buf_tex
[2][3000];
1660 PutBitContext pb
[2], pb2
[2], tex_pb
[2];
1663 init_put_bits(&pb
[i
], bit_buf
[i
], 3000, NULL
, NULL
);
1664 init_put_bits(&pb2
[i
], bit_buf2
[i
], 3000, NULL
, NULL
);
1665 init_put_bits(&tex_pb
[i
], bit_buf_tex
[i
], 3000, NULL
, NULL
);
1668 s
->picture_number
= picture_number
;
1673 s
->block_wrap
[3]= s
->mb_width
*2 + 2;
1675 s
->block_wrap
[5]= s
->mb_width
+ 2;
1677 /* Reset the average MB variance */
1679 s
->mc_mb_var_sum
= 0;
1681 /* we need to initialize some time vars before we can encode b-frames */
1682 if (s
->h263_pred
&& !s
->h263_msmpeg4
)
1683 ff_set_mpeg4_time(s
, s
->picture_number
);
1685 /* Estimate motion for every MB */
1686 if(s
->pict_type
!= I_TYPE
){
1687 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
1688 s
->block_index
[0]= s
->block_wrap
[0]*(mb_y
*2 + 1) - 1;
1689 s
->block_index
[1]= s
->block_wrap
[0]*(mb_y
*2 + 1);
1690 s
->block_index
[2]= s
->block_wrap
[0]*(mb_y
*2 + 2) - 1;
1691 s
->block_index
[3]= s
->block_wrap
[0]*(mb_y
*2 + 2);
1692 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
1695 s
->block_index
[0]+=2;
1696 s
->block_index
[1]+=2;
1697 s
->block_index
[2]+=2;
1698 s
->block_index
[3]+=2;
1700 /* compute motion vector & mb_type and store in context */
1701 if(s
->pict_type
==B_TYPE
)
1702 ff_estimate_b_frame_motion(s
, mb_x
, mb_y
);
1704 ff_estimate_p_frame_motion(s
, mb_x
, mb_y
);
1705 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
1709 }else /* if(s->pict_type == I_TYPE) */{
1711 //FIXME do we need to zero them?
1712 memset(s
->motion_val
[0], 0, sizeof(INT16
)*(s
->mb_width
*2 + 2)*(s
->mb_height
*2 + 2)*2);
1713 memset(s
->p_mv_table
, 0, sizeof(INT16
)*(s
->mb_width
+2)*(s
->mb_height
+2)*2);
1714 memset(s
->mb_type
, MB_TYPE_INTRA
, sizeof(UINT8
)*s
->mb_width
*s
->mb_height
);
1717 if(s
->mb_var_sum
< s
->mc_mb_var_sum
&& s
->pict_type
== P_TYPE
){ //FIXME subtract MV bits
1718 s
->pict_type
= I_TYPE
;
1719 memset(s
->mb_type
, MB_TYPE_INTRA
, sizeof(UINT8
)*s
->mb_width
*s
->mb_height
);
1720 if(s
->max_b_frames
==0){
1721 s
->input_pict_type
= I_TYPE
;
1722 s
->input_picture_in_gop_number
=0;
1724 //printf("Scene change detected, encoding as I Frame\n");
1727 if(s
->pict_type
==P_TYPE
|| s
->pict_type
==S_TYPE
)
1728 s
->f_code
= ff_get_best_fcode(s
, s
->p_mv_table
, MB_TYPE_INTER
);
1729 ff_fix_long_p_mvs(s
);
1730 if(s
->pict_type
==B_TYPE
){
1731 s
->f_code
= ff_get_best_fcode(s
, s
->b_forw_mv_table
, MB_TYPE_FORWARD
);
1732 s
->b_code
= ff_get_best_fcode(s
, s
->b_back_mv_table
, MB_TYPE_BACKWARD
);
1734 ff_fix_long_b_mvs(s
, s
->b_forw_mv_table
, s
->f_code
, MB_TYPE_FORWARD
);
1735 ff_fix_long_b_mvs(s
, s
->b_back_mv_table
, s
->b_code
, MB_TYPE_BACKWARD
);
1736 ff_fix_long_b_mvs(s
, s
->b_bidir_forw_mv_table
, s
->f_code
, MB_TYPE_BIDIR
);
1737 ff_fix_long_b_mvs(s
, s
->b_bidir_back_mv_table
, s
->b_code
, MB_TYPE_BIDIR
);
1740 //printf("f_code %d ///\n", s->f_code);
1742 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var);
1744 if(s
->flags
&CODEC_FLAG_PASS2
)
1745 s
->qscale
= ff_rate_estimate_qscale_pass2(s
);
1746 else if (!s
->fixed_qscale
)
1747 s
->qscale
= ff_rate_estimate_qscale(s
);
1749 if (s
->out_format
== FMT_MJPEG
) {
1750 /* for mjpeg, we do include qscale in the matrix */
1751 s
->intra_matrix
[0] = default_intra_matrix
[0];
1753 s
->intra_matrix
[i
] = CLAMP_TO_8BIT((default_intra_matrix
[i
] * s
->qscale
) >> 3);
1754 convert_matrix(s
->q_intra_matrix
, s
->q_intra_matrix16
,
1755 s
->q_intra_matrix16_bias
, s
->intra_matrix
, s
->intra_quant_bias
);
1758 s
->last_bits
= get_bit_count(&s
->pb
);
1759 switch(s
->out_format
) {
1761 mjpeg_picture_header(s
);
1764 if (s
->h263_msmpeg4
)
1765 msmpeg4_encode_picture_header(s
, picture_number
);
1766 else if (s
->h263_pred
)
1767 mpeg4_encode_picture_header(s
, picture_number
);
1768 else if (s
->h263_rv10
)
1769 rv10_encode_picture_header(s
, picture_number
);
1771 h263_encode_picture_header(s
, picture_number
);
1774 mpeg1_encode_picture_header(s
, picture_number
);
1777 bits
= get_bit_count(&s
->pb
);
1778 s
->header_bits
= bits
- s
->last_bits
;
1788 /* init last dc values */
1789 /* note: quant matrix value (8) is implied here */
1790 s
->last_dc
[0] = 128;
1791 s
->last_dc
[1] = 128;
1792 s
->last_dc
[2] = 128;
1794 s
->last_mv
[0][0][0] = 0;
1795 s
->last_mv
[0][0][1] = 0;
1797 /* Get the GOB height based on picture height */
1798 if (s
->out_format
== FMT_H263
&& !s
->h263_pred
&& !s
->h263_msmpeg4
) {
1799 if (s
->height
<= 400)
1801 else if (s
->height
<= 800)
1805 }else if(s
->codec_id
==CODEC_ID_MPEG4
){
1809 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->data_partitioning
&& s
->pict_type
!=B_TYPE
)
1810 ff_mpeg4_init_partitions(s
);
1814 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
1815 /* Put GOB header based on RTP MTU for formats which support it per line (H263*)*/
1816 /* TODO: Put all this stuff in a separate generic function */
1819 s
->ptr_lastgob
= s
->pb
.buf
;
1820 s
->ptr_last_mb_line
= s
->pb
.buf
;
1821 } else if (s
->out_format
== FMT_H263
&& !s
->h263_pred
&& !s
->h263_msmpeg4
&& !(mb_y
% s
->gob_index
)) {
1822 // MN: we could move the space check from h263 -> here, as its not h263 specific
1823 last_gob
= h263_encode_gob_header(s
, mb_y
);
1825 s
->first_slice_line
= 1;
1827 /*MN: we reset it here instead at the end of each line cuz mpeg4 can have
1828 slice lines starting & ending in the middle*/
1829 s
->first_slice_line
= 0;
1834 s
->block_index
[0]= s
->block_wrap
[0]*(mb_y
*2 + 1) - 1;
1835 s
->block_index
[1]= s
->block_wrap
[0]*(mb_y
*2 + 1);
1836 s
->block_index
[2]= s
->block_wrap
[0]*(mb_y
*2 + 2) - 1;
1837 s
->block_index
[3]= s
->block_wrap
[0]*(mb_y
*2 + 2);
1838 s
->block_index
[4]= s
->block_wrap
[4]*(mb_y
+ 1) + s
->block_wrap
[0]*(s
->mb_height
*2 + 2);
1839 s
->block_index
[5]= s
->block_wrap
[4]*(mb_y
+ 1 + s
->mb_height
+ 2) + s
->block_wrap
[0]*(s
->mb_height
*2 + 2);
1840 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
1841 const int mb_type
= s
->mb_type
[mb_y
* s
->mb_width
+ mb_x
];
1842 const int xy
= (mb_y
+1) * (s
->mb_width
+2) + mb_x
+ 1;
1848 s
->block_index
[0]+=2;
1849 s
->block_index
[1]+=2;
1850 s
->block_index
[2]+=2;
1851 s
->block_index
[3]+=2;
1852 s
->block_index
[4]++;
1853 s
->block_index
[5]++;
1855 /* write gob / video packet header for formats which support it at any MB (MPEG4) */
1856 if(s
->rtp_mode
&& s
->mb_y
>0 && s
->codec_id
==CODEC_ID_MPEG4
){
1857 int pdif
= pbBufPtr(&s
->pb
) - s
->ptr_lastgob
;
1859 //the *2 is there so we stay below the requested size
1860 if(pdif
+ s
->mb_line_avgsize
/s
->mb_width
>= s
->rtp_payload_size
){
1861 if(s
->codec_id
==CODEC_ID_MPEG4
){
1862 if(s
->data_partitioning
&& s
->pict_type
!=B_TYPE
){
1863 ff_mpeg4_merge_partitions(s
);
1864 ff_mpeg4_init_partitions(s
);
1866 ff_mpeg4_encode_video_packet_header(s
);
1868 if(s
->flags
&CODEC_FLAG_PASS1
){
1869 int bits
= get_bit_count(&s
->pb
);
1870 s
->misc_bits
+= bits
- s
->last_bits
;
1873 ff_mpeg4_clean_buffers(s
);
1875 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
1876 s
->first_slice_line
=1;
1877 s
->resync_mb_x
=mb_x
;
1878 s
->resync_mb_y
=mb_y
;
1881 if( (s
->resync_mb_x
== s
->mb_x
)
1882 && s
->resync_mb_y
+1 == s
->mb_y
){
1883 s
->first_slice_line
=0;
1887 if(mb_type
& (mb_type
-1)){ // more than 1 MB type possible
1889 int pb_bits_count
, pb2_bits_count
, tex_pb_bits_count
;
1891 copy_context_before_encode(&backup_s
, s
, -1);
1893 best_s
.data_partitioning
= s
->data_partitioning
;
1894 if(s
->data_partitioning
){
1895 backup_s
.pb2
= s
->pb2
;
1896 backup_s
.tex_pb
= s
->tex_pb
;
1899 if(mb_type
&MB_TYPE_INTER
){
1900 s
->mv_dir
= MV_DIR_FORWARD
;
1901 s
->mv_type
= MV_TYPE_16X16
;
1903 s
->mv
[0][0][0] = s
->p_mv_table
[xy
][0];
1904 s
->mv
[0][0][1] = s
->p_mv_table
[xy
][1];
1905 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTER
, pb
, pb2
, tex_pb
,
1906 &dmin
, &next_block
, s
->mv
[0][0][0], s
->mv
[0][0][1]);
1908 if(mb_type
&MB_TYPE_INTER4V
){
1909 s
->mv_dir
= MV_DIR_FORWARD
;
1910 s
->mv_type
= MV_TYPE_8X8
;
1913 s
->mv
[0][i
][0] = s
->motion_val
[s
->block_index
[i
]][0];
1914 s
->mv
[0][i
][1] = s
->motion_val
[s
->block_index
[i
]][1];
1916 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTER4V
, pb
, pb2
, tex_pb
,
1917 &dmin
, &next_block
, 0, 0);
1919 if(mb_type
&MB_TYPE_FORWARD
){
1920 s
->mv_dir
= MV_DIR_FORWARD
;
1921 s
->mv_type
= MV_TYPE_16X16
;
1923 s
->mv
[0][0][0] = s
->b_forw_mv_table
[xy
][0];
1924 s
->mv
[0][0][1] = s
->b_forw_mv_table
[xy
][1];
1925 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_FORWARD
, pb
, pb2
, tex_pb
,
1926 &dmin
, &next_block
, s
->mv
[0][0][0], s
->mv
[0][0][1]);
1928 if(mb_type
&MB_TYPE_BACKWARD
){
1929 s
->mv_dir
= MV_DIR_BACKWARD
;
1930 s
->mv_type
= MV_TYPE_16X16
;
1932 s
->mv
[1][0][0] = s
->b_back_mv_table
[xy
][0];
1933 s
->mv
[1][0][1] = s
->b_back_mv_table
[xy
][1];
1934 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_BACKWARD
, pb
, pb2
, tex_pb
,
1935 &dmin
, &next_block
, s
->mv
[1][0][0], s
->mv
[1][0][1]);
1937 if(mb_type
&MB_TYPE_BIDIR
){
1938 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
;
1939 s
->mv_type
= MV_TYPE_16X16
;
1941 s
->mv
[0][0][0] = s
->b_bidir_forw_mv_table
[xy
][0];
1942 s
->mv
[0][0][1] = s
->b_bidir_forw_mv_table
[xy
][1];
1943 s
->mv
[1][0][0] = s
->b_bidir_back_mv_table
[xy
][0];
1944 s
->mv
[1][0][1] = s
->b_bidir_back_mv_table
[xy
][1];
1945 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_BIDIR
, pb
, pb2
, tex_pb
,
1946 &dmin
, &next_block
, 0, 0);
1948 if(mb_type
&MB_TYPE_DIRECT
){
1949 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
| MV_DIRECT
;
1950 s
->mv_type
= MV_TYPE_16X16
; //FIXME
1952 s
->mv
[0][0][0] = s
->b_direct_forw_mv_table
[xy
][0];
1953 s
->mv
[0][0][1] = s
->b_direct_forw_mv_table
[xy
][1];
1954 s
->mv
[1][0][0] = s
->b_direct_back_mv_table
[xy
][0];
1955 s
->mv
[1][0][1] = s
->b_direct_back_mv_table
[xy
][1];
1956 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_DIRECT
, pb
, pb2
, tex_pb
,
1957 &dmin
, &next_block
, s
->b_direct_mv_table
[xy
][0], s
->b_direct_mv_table
[xy
][1]);
1959 if(mb_type
&MB_TYPE_INTRA
){
1960 s
->mv_dir
= MV_DIR_FORWARD
;
1961 s
->mv_type
= MV_TYPE_16X16
;
1965 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTRA
, pb
, pb2
, tex_pb
,
1966 &dmin
, &next_block
, 0, 0);
1967 /* force cleaning of ac/dc pred stuff if needed ... */
1968 if(s
->h263_pred
|| s
->h263_aic
)
1969 s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
]=1;
1971 copy_context_after_encode(s
, &best_s
, -1);
1973 pb_bits_count
= get_bit_count(&s
->pb
);
1974 flush_put_bits(&s
->pb
);
1975 ff_copy_bits(&backup_s
.pb
, bit_buf
[next_block
^1], pb_bits_count
);
1978 if(s
->data_partitioning
){
1979 pb2_bits_count
= get_bit_count(&s
->pb2
);
1980 flush_put_bits(&s
->pb2
);
1981 ff_copy_bits(&backup_s
.pb2
, bit_buf2
[next_block
^1], pb2_bits_count
);
1982 s
->pb2
= backup_s
.pb2
;
1984 tex_pb_bits_count
= get_bit_count(&s
->tex_pb
);
1985 flush_put_bits(&s
->tex_pb
);
1986 ff_copy_bits(&backup_s
.tex_pb
, bit_buf_tex
[next_block
^1], tex_pb_bits_count
);
1987 s
->tex_pb
= backup_s
.tex_pb
;
1989 s
->last_bits
= get_bit_count(&s
->pb
);
1991 int motion_x
, motion_y
;
1992 s
->mv_type
=MV_TYPE_16X16
;
1993 // only one MB-Type possible
1996 s
->mv_dir
= MV_DIR_FORWARD
;
1998 motion_x
= s
->mv
[0][0][0] = 0;
1999 motion_y
= s
->mv
[0][0][1] = 0;
2002 s
->mv_dir
= MV_DIR_FORWARD
;
2004 motion_x
= s
->mv
[0][0][0] = s
->p_mv_table
[xy
][0];
2005 motion_y
= s
->mv
[0][0][1] = s
->p_mv_table
[xy
][1];
2007 case MB_TYPE_INTER4V
:
2008 s
->mv_dir
= MV_DIR_FORWARD
;
2009 s
->mv_type
= MV_TYPE_8X8
;
2012 s
->mv
[0][i
][0] = s
->motion_val
[s
->block_index
[i
]][0];
2013 s
->mv
[0][i
][1] = s
->motion_val
[s
->block_index
[i
]][1];
2015 motion_x
= motion_y
= 0;
2017 case MB_TYPE_DIRECT
:
2018 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
| MV_DIRECT
;
2020 motion_x
=s
->b_direct_mv_table
[xy
][0];
2021 motion_y
=s
->b_direct_mv_table
[xy
][1];
2022 s
->mv
[0][0][0] = s
->b_direct_forw_mv_table
[xy
][0];
2023 s
->mv
[0][0][1] = s
->b_direct_forw_mv_table
[xy
][1];
2024 s
->mv
[1][0][0] = s
->b_direct_back_mv_table
[xy
][0];
2025 s
->mv
[1][0][1] = s
->b_direct_back_mv_table
[xy
][1];
2028 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
;
2032 s
->mv
[0][0][0] = s
->b_bidir_forw_mv_table
[xy
][0];
2033 s
->mv
[0][0][1] = s
->b_bidir_forw_mv_table
[xy
][1];
2034 s
->mv
[1][0][0] = s
->b_bidir_back_mv_table
[xy
][0];
2035 s
->mv
[1][0][1] = s
->b_bidir_back_mv_table
[xy
][1];
2037 case MB_TYPE_BACKWARD
:
2038 s
->mv_dir
= MV_DIR_BACKWARD
;
2040 motion_x
= s
->mv
[1][0][0] = s
->b_back_mv_table
[xy
][0];
2041 motion_y
= s
->mv
[1][0][1] = s
->b_back_mv_table
[xy
][1];
2043 case MB_TYPE_FORWARD
:
2044 s
->mv_dir
= MV_DIR_FORWARD
;
2046 motion_x
= s
->mv
[0][0][0] = s
->b_forw_mv_table
[xy
][0];
2047 motion_y
= s
->mv
[0][0][1] = s
->b_forw_mv_table
[xy
][1];
2048 // printf(" %d %d ", motion_x, motion_y);
2051 motion_x
=motion_y
=0; //gcc warning fix
2052 printf("illegal MB type\n");
2054 encode_mb(s
, motion_x
, motion_y
);
2056 /* clean the MV table in IPS frames for direct mode in B frames */
2057 if(s
->mb_intra
/* && I,P,S_TYPE */){
2058 s
->p_mv_table
[xy
][0]=0;
2059 s
->p_mv_table
[xy
][1]=0;
2062 MPV_decode_mb(s
, s
->block
);
2063 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_width, get_bit_count(&s->pb));
2067 /* Obtain average GOB size for RTP */
2070 s
->mb_line_avgsize
= pbBufPtr(&s
->pb
) - s
->ptr_last_mb_line
;
2071 else if (!(mb_y
% s
->gob_index
)) {
2072 s
->mb_line_avgsize
= (s
->mb_line_avgsize
+ pbBufPtr(&s
->pb
) - s
->ptr_last_mb_line
) >> 1;
2073 s
->ptr_last_mb_line
= pbBufPtr(&s
->pb
);
2075 //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y,
2076 // (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize);
2077 if(s
->codec_id
!=CODEC_ID_MPEG4
) s
->first_slice_line
= 0; //FIXME clean
2082 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->data_partitioning
&& s
->pict_type
!=B_TYPE
)
2083 ff_mpeg4_merge_partitions(s
);
2085 if (s
->msmpeg4_version
&& s
->msmpeg4_version
<4 && s
->pict_type
== I_TYPE
)
2086 msmpeg4_encode_ext_header(s
);
2088 if(s
->codec_id
==CODEC_ID_MPEG4
)
2089 ff_mpeg4_stuffing(&s
->pb
);
2091 //if (s->gob_number)
2092 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
2094 /* Send the last GOB if RTP */
2096 flush_put_bits(&s
->pb
);
2097 pdif
= pbBufPtr(&s
->pb
) - s
->ptr_lastgob
;
2098 /* Call the RTP callback to send the last GOB */
2099 if (s
->rtp_callback
)
2100 s
->rtp_callback(s
->ptr_lastgob
, pdif
, s
->gob_number
);
2101 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
2102 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
2106 static int dct_quantize_c(MpegEncContext
*s
,
2107 DCTELEM
*block
, int n
,
2108 int qscale
, int *overflow
)
2110 int i
, j
, level
, last_non_zero
, q
;
2114 unsigned int threshold1
, threshold2
;
2118 /* we need this permutation so that we correct the IDCT
2119 permutation. will be moved into DCT code */
2120 block_permute(block
);
2130 /* For AIC we skip quant/dequant of INTRADC */
2133 /* note: block[0] is assumed to be positive */
2134 block
[0] = (block
[0] + (q
>> 1)) / q
;
2137 qmat
= s
->q_intra_matrix
[qscale
];
2138 bias
= s
->intra_quant_bias
<<(QMAT_SHIFT
- 3 - QUANT_BIAS_SHIFT
);
2142 qmat
= s
->q_inter_matrix
[qscale
];
2143 bias
= s
->inter_quant_bias
<<(QMAT_SHIFT
- 3 - QUANT_BIAS_SHIFT
);
2145 threshold1
= (1<<(QMAT_SHIFT
- 3)) - bias
- 1;
2146 threshold2
= threshold1
<<1;
2149 j
= zigzag_direct
[i
];
2151 level
= level
* qmat
[j
];
2153 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
2154 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
2155 if(((unsigned)(level
+threshold1
))>threshold2
){
2157 level
= (bias
+ level
)>>(QMAT_SHIFT
- 3);
2160 level
= (bias
- level
)>>(QMAT_SHIFT
- 3);
2169 *overflow
= s
->max_qcoeff
< max
; //overflow might have happend
2171 return last_non_zero
;
2174 static void dct_unquantize_mpeg1_c(MpegEncContext
*s
,
2175 DCTELEM
*block
, int n
, int qscale
)
2177 int i
, level
, nCoeffs
;
2178 const UINT16
*quant_matrix
;
2180 if(s
->alternate_scan
) nCoeffs
= 64;
2181 else nCoeffs
= s
->block_last_index
[n
]+1;
2185 block
[0] = block
[0] * s
->y_dc_scale
;
2187 block
[0] = block
[0] * s
->c_dc_scale
;
2188 /* XXX: only mpeg1 */
2189 quant_matrix
= s
->intra_matrix
;
2190 for(i
=1;i
<nCoeffs
;i
++) {
2191 int j
= zigzag_direct
[i
];
2196 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2197 level
= (level
- 1) | 1;
2200 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2201 level
= (level
- 1) | 1;
2204 if (level
< -2048 || level
> 2047)
2205 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2212 quant_matrix
= s
->inter_matrix
;
2213 for(;i
<nCoeffs
;i
++) {
2214 int j
= zigzag_direct
[i
];
2219 level
= (((level
<< 1) + 1) * qscale
*
2220 ((int) (quant_matrix
[j
]))) >> 4;
2221 level
= (level
- 1) | 1;
2224 level
= (((level
<< 1) + 1) * qscale
*
2225 ((int) (quant_matrix
[j
]))) >> 4;
2226 level
= (level
- 1) | 1;
2229 if (level
< -2048 || level
> 2047)
2230 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2238 static void dct_unquantize_mpeg2_c(MpegEncContext
*s
,
2239 DCTELEM
*block
, int n
, int qscale
)
2241 int i
, level
, nCoeffs
;
2242 const UINT16
*quant_matrix
;
2244 if(s
->alternate_scan
) nCoeffs
= 64;
2245 else nCoeffs
= s
->block_last_index
[n
]+1;
2249 block
[0] = block
[0] * s
->y_dc_scale
;
2251 block
[0] = block
[0] * s
->c_dc_scale
;
2252 quant_matrix
= s
->intra_matrix
;
2253 for(i
=1;i
<nCoeffs
;i
++) {
2254 int j
= zigzag_direct
[i
];
2259 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2262 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2265 if (level
< -2048 || level
> 2047)
2266 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2274 quant_matrix
= s
->inter_matrix
;
2275 for(;i
<nCoeffs
;i
++) {
2276 int j
= zigzag_direct
[i
];
2281 level
= (((level
<< 1) + 1) * qscale
*
2282 ((int) (quant_matrix
[j
]))) >> 4;
2285 level
= (((level
<< 1) + 1) * qscale
*
2286 ((int) (quant_matrix
[j
]))) >> 4;
2289 if (level
< -2048 || level
> 2047)
2290 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2301 static void dct_unquantize_h263_c(MpegEncContext
*s
,
2302 DCTELEM
*block
, int n
, int qscale
)
2304 int i
, level
, qmul
, qadd
;
2310 block
[0] = block
[0] * s
->y_dc_scale
;
2312 block
[0] = block
[0] * s
->c_dc_scale
;
2315 nCoeffs
= 64; //does not allways use zigzag table
2318 nCoeffs
= zigzag_end
[ s
->block_last_index
[n
] ];
2321 qmul
= s
->qscale
<< 1;
2322 if (s
->h263_aic
&& s
->mb_intra
)
2325 qadd
= (s
->qscale
- 1) | 1;
2327 for(;i
<nCoeffs
;i
++) {
2331 level
= level
* qmul
- qadd
;
2333 level
= level
* qmul
+ qadd
;
2336 if (level
< -2048 || level
> 2047)
2337 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2344 static void remove_ac(MpegEncContext
*s
, uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
, int mb_x
, int mb_y
)
2346 int dc
, dcb
, dcr
, y
, i
;
2348 dc
= s
->dc_val
[0][mb_x
*2+1 + (i
&1) + (mb_y
*2+1 + (i
>>1))*(s
->mb_width
*2+2)];
2352 dest_y
[x
+ (i
&1)*8 + (y
+ (i
>>1)*8)*s
->linesize
]= dc
/8;
2356 dcb
= s
->dc_val
[1][mb_x
+1 + (mb_y
+1)*(s
->mb_width
+2)];
2357 dcr
= s
->dc_val
[2][mb_x
+1 + (mb_y
+1)*(s
->mb_width
+2)];
2361 dest_cb
[x
+ y
*(s
->linesize
>>1)]= dcb
/8;
2362 dest_cr
[x
+ y
*(s
->linesize
>>1)]= dcr
/8;
2368 * will conceal past errors, and allso drop b frames if needed
2371 void ff_conceal_past_errors(MpegEncContext
*s
, int unknown_pos
)
2376 int i
, intra_count
=0, inter_count
=0;
2377 int intra_conceal
= s
->msmpeg4_version ?
50 : 50; //FIXME finetune
2378 int inter_conceal
= s
->msmpeg4_version ?
50 : 50;
2381 if(mb_x
>=s
->mb_width
) mb_x
= s
->mb_width
-1;
2382 if(mb_y
>=s
->mb_height
) mb_y
= s
->mb_height
-1;
2384 if(s
->decoding_error
==0 && unknown_pos
){
2385 if(s
->data_partitioning
&& s
->pict_type
!=B_TYPE
)
2386 s
->decoding_error
= DECODING_AC_LOST
;
2388 s
->decoding_error
= DECODING_DESYNC
;
2391 if(s
->decoding_error
==DECODING_DESYNC
&& s
->pict_type
!=B_TYPE
) s
->next_p_frame_damaged
=1;
2393 for(i
=mb_x
+ mb_y
*s
->mb_width
; i
>=0; i
--){
2394 if(s
->mbintra_table
[i
]) intra_count
++;
2398 if(s
->decoding_error
==DECODING_AC_LOST
){
2401 }else if(s
->decoding_error
==DECODING_ACDC_LOST
){
2406 if(unknown_pos
&& (intra_count
<inter_count
)){
2407 intra_conceal
= inter_conceal
= s
->mb_num
;
2408 // printf("%d %d\n",intra_count, inter_count);
2411 fprintf(stderr
, "concealing errors\n");
2413 /* for all MBs from the current one back until the last resync marker */
2414 for(; mb_y
>=0 && mb_y
>=s
->resync_mb_y
; mb_y
--){
2415 for(; mb_x
>=0; mb_x
--){
2416 uint8_t *dest_y
= s
->current_picture
[0] + (mb_y
* 16* s
->linesize
) + mb_x
* 16;
2417 uint8_t *dest_cb
= s
->current_picture
[1] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
2418 uint8_t *dest_cr
= s
->current_picture
[2] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
2419 int mb_x_backup
= s
->mb_x
; //FIXME pass xy to mpeg_motion
2420 int mb_y_backup
= s
->mb_y
;
2423 if(s
->mbintra_table
[mb_y
*s
->mb_width
+ mb_x
] && mb_dist
<intra_conceal
){
2424 if(s
->decoding_error
==DECODING_AC_LOST
){
2425 remove_ac(s
, dest_y
, dest_cb
, dest_cr
, mb_x
, mb_y
);
2426 // printf("remove ac to %d %d\n", mb_x, mb_y);
2428 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
2429 s
->last_picture
, 0, 0, put_pixels_tab
,
2430 0/*mx*/, 0/*my*/, 16);
2433 else if(!s
->mbintra_table
[mb_y
*s
->mb_width
+ mb_x
] && mb_dist
<inter_conceal
){
2437 if(s
->decoding_error
!=DECODING_DESYNC
){
2438 int xy
= mb_x
*2+1 + (mb_y
*2+1)*(s
->mb_width
*2+2);
2439 mx
= s
->motion_val
[ xy
][0];
2440 my
= s
->motion_val
[ xy
][1];
2443 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
2444 s
->last_picture
, 0, 0, put_pixels_tab
,
2447 s
->mb_x
= mb_x_backup
;
2448 s
->mb_y
= mb_y_backup
;
2450 if(mb_x
== s
->resync_mb_x
&& mb_y
== s
->resync_mb_y
) return;
2451 if(!s
->mbskip_table
[mb_x
+ mb_y
*s
->mb_width
]) mb_dist
++;
2457 AVCodec mpeg1video_encoder
= {
2460 CODEC_ID_MPEG1VIDEO
,
2461 sizeof(MpegEncContext
),
2467 AVCodec h263_encoder
= {
2471 sizeof(MpegEncContext
),
2477 AVCodec h263p_encoder
= {
2481 sizeof(MpegEncContext
),
2487 AVCodec rv10_encoder
= {
2491 sizeof(MpegEncContext
),
2497 AVCodec mjpeg_encoder
= {
2501 sizeof(MpegEncContext
),
2507 AVCodec mpeg4_encoder
= {
2511 sizeof(MpegEncContext
),
2517 AVCodec msmpeg4v1_encoder
= {
2521 sizeof(MpegEncContext
),
2527 AVCodec msmpeg4v2_encoder
= {
2531 sizeof(MpegEncContext
),
2537 AVCodec msmpeg4v3_encoder
= {
2541 sizeof(MpegEncContext
),