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
);
1106 ff_idct_put (dest
, line_size
, block
);
1109 /* add block[] to dest[] */
1110 static inline void add_dct(MpegEncContext
*s
,
1111 DCTELEM
*block
, int i
, UINT8
*dest
, int line_size
)
1113 /* skip dequant / idct if we are really late ;) */
1114 if(s
->hurry_up
>1) return;
1116 if (s
->block_last_index
[i
] >= 0) {
1118 if(s
->encoding
|| (!s
->h263_msmpeg4
))
1119 s
->dct_unquantize(s
, block
, i
, s
->qscale
);
1121 ff_idct_add (dest
, line_size
, block
);
1126 * cleans dc, ac, coded_block for the current non intra MB
1128 void ff_clean_intra_table_entries(MpegEncContext
*s
)
1130 int wrap
= s
->block_wrap
[0];
1131 int xy
= s
->block_index
[0];
1134 s
->dc_val
[0][xy
+ 1 ] =
1135 s
->dc_val
[0][xy
+ wrap
] =
1136 s
->dc_val
[0][xy
+ 1 + wrap
] = 1024;
1138 memset(s
->ac_val
[0][xy
], 0, 32 * sizeof(INT16
));
1139 memset(s
->ac_val
[0][xy
+ wrap
], 0, 32 * sizeof(INT16
));
1140 if (s
->msmpeg4_version
>=3) {
1141 s
->coded_block
[xy
] =
1142 s
->coded_block
[xy
+ 1 ] =
1143 s
->coded_block
[xy
+ wrap
] =
1144 s
->coded_block
[xy
+ 1 + wrap
] = 0;
1147 wrap
= s
->block_wrap
[4];
1148 xy
= s
->mb_x
+ 1 + (s
->mb_y
+ 1) * wrap
;
1150 s
->dc_val
[2][xy
] = 1024;
1152 memset(s
->ac_val
[1][xy
], 0, 16 * sizeof(INT16
));
1153 memset(s
->ac_val
[2][xy
], 0, 16 * sizeof(INT16
));
1155 s
->mbintra_table
[s
->mb_x
+ s
->mb_y
*s
->mb_width
]= 0;
1158 /* generic function called after a macroblock has been parsed by the
1159 decoder or after it has been encoded by the encoder.
1161 Important variables used:
1162 s->mb_intra : true if intra macroblock
1163 s->mv_dir : motion vector direction
1164 s->mv_type : motion vector type
1165 s->mv : motion vector
1166 s->interlaced_dct : true if interlaced dct used (mpeg2)
1168 void MPV_decode_mb(MpegEncContext
*s
, DCTELEM block
[6][64])
1171 int dct_linesize
, dct_offset
;
1172 op_pixels_func
*op_pix
;
1173 qpel_mc_func
*op_qpix
;
1178 #ifdef FF_POSTPROCESS
1179 /* Obsolete. Exists for compatibility with mplayer only. */
1180 quant_store
[mb_y
][mb_x
]=s
->qscale
;
1181 //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale);
1183 if(s
->avctx
->quant_store
) s
->avctx
->quant_store
[mb_y
*s
->avctx
->qstride
+mb_x
] = s
->qscale
;
1186 /* update DC predictors for P macroblocks */
1188 if (s
->h263_pred
|| s
->h263_aic
) {
1189 if(s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
])
1190 ff_clean_intra_table_entries(s
);
1194 s
->last_dc
[2] = 128 << s
->intra_dc_precision
;
1197 else if (s
->h263_pred
|| s
->h263_aic
)
1198 s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
]=1;
1200 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
1201 if (s
->out_format
== FMT_H263
) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
1202 if(s
->pict_type
!=B_TYPE
){
1203 int xy
, wrap
, motion_x
, motion_y
;
1205 wrap
= 2 * s
->mb_width
+ 2;
1206 xy
= 2 * mb_x
+ 1 + (2 * mb_y
+ 1) * wrap
;
1211 } else if (s
->mv_type
== MV_TYPE_16X16
) {
1212 motion_x
= s
->mv
[0][0][0];
1213 motion_y
= s
->mv
[0][0][1];
1215 /* no update if 8X8 because it has been done during parsing */
1216 s
->motion_val
[xy
][0] = motion_x
;
1217 s
->motion_val
[xy
][1] = motion_y
;
1218 s
->motion_val
[xy
+ 1][0] = motion_x
;
1219 s
->motion_val
[xy
+ 1][1] = motion_y
;
1220 s
->motion_val
[xy
+ wrap
][0] = motion_x
;
1221 s
->motion_val
[xy
+ wrap
][1] = motion_y
;
1222 s
->motion_val
[xy
+ 1 + wrap
][0] = motion_x
;
1223 s
->motion_val
[xy
+ 1 + wrap
][1] = motion_y
;
1228 if (!(s
->encoding
&& (s
->intra_only
|| s
->pict_type
==B_TYPE
))) {
1229 UINT8
*dest_y
, *dest_cb
, *dest_cr
;
1232 /* avoid copy if macroblock skipped in last frame too
1233 dont touch it for B-frames as they need the skip info from the next p-frame */
1234 if (s
->pict_type
!= B_TYPE
) {
1235 mbskip_ptr
= &s
->mbskip_table
[s
->mb_y
* s
->mb_width
+ s
->mb_x
];
1238 /* if previous was skipped too, then nothing to do !
1239 skip only during decoding as we might trash the buffers during encoding a bit */
1240 if (*mbskip_ptr
!= 0 && !s
->encoding
)
1242 *mbskip_ptr
= 1; /* indicate that this time we skiped it */
1244 *mbskip_ptr
= 0; /* not skipped */
1248 dest_y
= s
->current_picture
[0] + (mb_y
* 16 * s
->linesize
) + mb_x
* 16;
1249 dest_cb
= s
->current_picture
[1] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1250 dest_cr
= s
->current_picture
[2] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1252 if (s
->interlaced_dct
) {
1253 dct_linesize
= s
->linesize
* 2;
1254 dct_offset
= s
->linesize
;
1256 dct_linesize
= s
->linesize
;
1257 dct_offset
= s
->linesize
* 8;
1261 const int xy
= s
->mb_y
* s
->mb_width
+ s
->mb_x
;
1262 /* motion handling */
1263 /* decoding or more than one mb_type (MC was allready done otherwise) */
1264 if((!s
->encoding
) || (s
->mb_type
[xy
]&(s
->mb_type
[xy
]-1))){
1265 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
){
1266 op_pix
= put_pixels_tab
;
1267 op_qpix
= qpel_mc_rnd_tab
;
1269 op_pix
= put_no_rnd_pixels_tab
;
1270 op_qpix
= qpel_mc_no_rnd_tab
;
1273 if (s
->mv_dir
& MV_DIR_FORWARD
) {
1274 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 0, s
->last_picture
, op_pix
, op_qpix
);
1275 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
)
1276 op_pix
= avg_pixels_tab
;
1278 op_pix
= avg_no_rnd_pixels_tab
;
1280 if (s
->mv_dir
& MV_DIR_BACKWARD
) {
1281 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 1, s
->next_picture
, op_pix
, op_qpix
);
1285 /* add dct residue */
1286 add_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
1287 add_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
1288 add_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
1289 add_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
1291 add_dct(s
, block
[4], 4, dest_cb
, s
->linesize
>> 1);
1292 add_dct(s
, block
[5], 5, dest_cr
, s
->linesize
>> 1);
1294 /* dct only in intra block */
1295 put_dct(s
, block
[0], 0, dest_y
, dct_linesize
);
1296 put_dct(s
, block
[1], 1, dest_y
+ 8, dct_linesize
);
1297 put_dct(s
, block
[2], 2, dest_y
+ dct_offset
, dct_linesize
);
1298 put_dct(s
, block
[3], 3, dest_y
+ dct_offset
+ 8, dct_linesize
);
1300 put_dct(s
, block
[4], 4, dest_cb
, s
->linesize
>> 1);
1301 put_dct(s
, block
[5], 5, dest_cr
, s
->linesize
>> 1);
1305 emms_c(); //FIXME remove
1308 static inline void dct_single_coeff_elimination(MpegEncContext
*s
, int n
, int threshold
, int skip_dc
)
1310 static const char tab
[64]=
1322 DCTELEM
*block
= s
->block
[n
];
1323 const int last_index
= s
->block_last_index
[n
];
1325 if(skip_dc
) skip_dc
=1;
1327 /* are all which we could set to zero are allready zero? */
1328 if(last_index
<=skip_dc
- 1) return;
1330 for(i
=0; i
<=last_index
; i
++){
1331 const int j
= zigzag_direct
[i
];
1332 const int level
= ABS(block
[j
]);
1334 if(skip_dc
&& i
==0) continue;
1343 if(score
>= threshold
) return;
1344 for(i
=skip_dc
; i
<=last_index
; i
++){
1345 const int j
= zigzag_direct
[i
];
1348 if(block
[0]) s
->block_last_index
[n
]= 0;
1349 else s
->block_last_index
[n
]= -1;
1352 static inline void clip_coeffs(MpegEncContext
*s
, DCTELEM
*block
, int last_index
)
1355 const int maxlevel
= s
->max_qcoeff
;
1356 const int minlevel
= s
->min_qcoeff
;
1358 for(i
=0;i
<=last_index
; i
++){
1359 const int j
= zigzag_direct
[i
];
1360 int level
= block
[j
];
1362 if (level
>maxlevel
) level
=maxlevel
;
1363 else if(level
<minlevel
) level
=minlevel
;
1368 static void encode_mb(MpegEncContext
*s
, int motion_x
, int motion_y
)
1370 const int mb_x
= s
->mb_x
;
1371 const int mb_y
= s
->mb_y
;
1375 if (s
->interlaced_dct
) {
1376 dct_linesize
= s
->linesize
* 2;
1377 dct_offset
= s
->linesize
;
1379 dct_linesize
= s
->linesize
;
1380 dct_offset
= s
->linesize
* 8;
1383 for(i
=0; i
<6; i
++) skip_dct
[i
]=0;
1390 ptr
= s
->new_picture
[0] + (mb_y
* 16 * wrap
) + mb_x
* 16;
1391 get_pixels(s
->block
[0], ptr
, wrap
);
1392 get_pixels(s
->block
[1], ptr
+ 8, wrap
);
1393 get_pixels(s
->block
[2], ptr
+ 8 * wrap
, wrap
);
1394 get_pixels(s
->block
[3], ptr
+ 8 * wrap
+ 8, wrap
);
1397 ptr
= s
->new_picture
[1] + (mb_y
* 8 * wrap
) + mb_x
* 8;
1398 get_pixels(s
->block
[4], ptr
, wrap
);
1400 ptr
= s
->new_picture
[2] + (mb_y
* 8 * wrap
) + mb_x
* 8;
1401 get_pixels(s
->block
[5], ptr
, wrap
);
1403 op_pixels_func
*op_pix
;
1404 qpel_mc_func
*op_qpix
;
1405 UINT8
*dest_y
, *dest_cb
, *dest_cr
;
1406 UINT8
*ptr_y
, *ptr_cb
, *ptr_cr
;
1409 dest_y
= s
->current_picture
[0] + (mb_y
* 16 * s
->linesize
) + mb_x
* 16;
1410 dest_cb
= s
->current_picture
[1] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1411 dest_cr
= s
->current_picture
[2] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
1412 wrap_y
= s
->linesize
;
1414 ptr_y
= s
->new_picture
[0] + (mb_y
* 16 * wrap_y
) + mb_x
* 16;
1415 ptr_cb
= s
->new_picture
[1] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
1416 ptr_cr
= s
->new_picture
[2] + (mb_y
* 8 * wrap_c
) + mb_x
* 8;
1418 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
){
1419 op_pix
= put_pixels_tab
;
1420 op_qpix
= qpel_mc_rnd_tab
;
1422 op_pix
= put_no_rnd_pixels_tab
;
1423 op_qpix
= qpel_mc_no_rnd_tab
;
1426 if (s
->mv_dir
& MV_DIR_FORWARD
) {
1427 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 0, s
->last_picture
, op_pix
, op_qpix
);
1428 if ((!s
->no_rounding
) || s
->pict_type
==B_TYPE
)
1429 op_pix
= avg_pixels_tab
;
1431 op_pix
= avg_no_rnd_pixels_tab
;
1433 if (s
->mv_dir
& MV_DIR_BACKWARD
) {
1434 MPV_motion(s
, dest_y
, dest_cb
, dest_cr
, 1, s
->next_picture
, op_pix
, op_qpix
);
1437 diff_pixels(s
->block
[0], ptr_y
, dest_y
, wrap_y
);
1438 diff_pixels(s
->block
[1], ptr_y
+ 8, dest_y
+ 8, wrap_y
);
1439 diff_pixels(s
->block
[2], ptr_y
+ 8 * wrap_y
, dest_y
+ 8 * wrap_y
, wrap_y
);
1440 diff_pixels(s
->block
[3], ptr_y
+ 8 * wrap_y
+ 8, dest_y
+ 8 * wrap_y
+ 8, wrap_y
);
1441 diff_pixels(s
->block
[4], ptr_cb
, dest_cb
, wrap_c
);
1442 diff_pixels(s
->block
[5], ptr_cr
, dest_cr
, wrap_c
);
1444 /* pre quantization */
1445 if(s
->mc_mb_var
[s
->mb_width
*mb_y
+ mb_x
]<2*s
->qscale
*s
->qscale
){
1446 if(pix_abs8x8(ptr_y
, dest_y
, wrap_y
) < 20*s
->qscale
) skip_dct
[0]= 1;
1447 if(pix_abs8x8(ptr_y
+ 8, dest_y
+ 8, wrap_y
) < 20*s
->qscale
) skip_dct
[1]= 1;
1448 if(pix_abs8x8(ptr_y
+ 8*wrap_y
, dest_y
+ 8*wrap_y
, wrap_y
) < 20*s
->qscale
) skip_dct
[2]= 1;
1449 if(pix_abs8x8(ptr_y
+ 8*wrap_y
+ 8, dest_y
+ 8*wrap_y
+ 8, wrap_y
) < 20*s
->qscale
) skip_dct
[3]= 1;
1450 if(pix_abs8x8(ptr_cb
, dest_cb
, wrap_y
) < 20*s
->qscale
) skip_dct
[4]= 1;
1451 if(pix_abs8x8(ptr_cr
, dest_cr
, wrap_y
) < 20*s
->qscale
) skip_dct
[5]= 1;
1457 if(skip_dct
[i
]) num
++;
1460 if(s
->mb_x
==0 && s
->mb_y
==0){
1462 printf("%6d %1d\n", stat
[i
], i
);
1475 adap_parm
= ((s
->avg_mb_var
<< 1) + s
->mb_var
[s
->mb_width
*mb_y
+mb_x
] + 1.0) /
1476 ((s
->mb_var
[s
->mb_width
*mb_y
+mb_x
] << 1) + s
->avg_mb_var
+ 1.0);
1478 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
1479 (s
->mb_type
[s
->mb_width
*mb_y
+mb_x
] > 0) ?
'I' : 'P',
1480 s
->qscale
, adap_parm
, s
->qscale
*adap_parm
,
1481 s
->mb_var
[s
->mb_width
*mb_y
+mb_x
], s
->avg_mb_var
);
1484 /* DCT & quantize */
1485 if (s
->h263_pred
&& !(s
->msmpeg4_version
==1 || s
->msmpeg4_version
==2)) {
1487 } else if (s
->h263_aic
) {
1488 s
->y_dc_scale
= 2*s
->qscale
;
1489 s
->c_dc_scale
= 2*s
->qscale
;
1491 /* default quantization values */
1495 if(s
->out_format
==FMT_MJPEG
){
1498 s
->block_last_index
[i
] = dct_quantize(s
, s
->block
[i
], i
, 8, &overflow
);
1499 if (overflow
) clip_coeffs(s
, s
->block
[i
], s
->block_last_index
[i
]);
1505 s
->block_last_index
[i
] = dct_quantize(s
, s
->block
[i
], i
, s
->qscale
, &overflow
);
1506 // FIXME we could decide to change to quantizer instead of clipping
1507 // JS: I don't think that would be a good idea it could lower quality instead
1508 // of improve it. Just INTRADC clipping deserves changes in quantizer
1509 if (overflow
) clip_coeffs(s
, s
->block
[i
], s
->block_last_index
[i
]);
1511 s
->block_last_index
[i
]= -1;
1513 if(s
->luma_elim_threshold
&& !s
->mb_intra
)
1515 dct_single_coeff_elimination(s
, i
, s
->luma_elim_threshold
, 0);
1516 if(s
->chroma_elim_threshold
&& !s
->mb_intra
)
1518 dct_single_coeff_elimination(s
, i
, s
->chroma_elim_threshold
, 1);
1521 /* huffman encode */
1522 switch(s
->out_format
) {
1524 mpeg1_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1527 if (s
->h263_msmpeg4
)
1528 msmpeg4_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1529 else if(s
->h263_pred
)
1530 mpeg4_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1532 h263_encode_mb(s
, s
->block
, motion_x
, motion_y
);
1535 mjpeg_encode_mb(s
, s
->block
);
1540 void ff_copy_bits(PutBitContext
*pb
, UINT8
*src
, int length
)
1543 int bytes
= length
>>4;
1544 int bits
= length
&15;
1547 if(length
==0) return;
1549 for(i
=0; i
<bytes
; i
++) put_bits(pb
, 16, be2me_16(((uint16_t*)src
)[i
]));
1550 put_bits(pb
, bits
, be2me_16(((uint16_t*)src
)[i
])>>(16-bits
));
1552 int bytes
= length
>>3;
1556 for(i
=0; i
<bytes
; i
++) put_bits(pb
, 8, src
[i
]);
1557 put_bits(pb
, bits
, src
[i
]>>(8-bits
));
1561 static inline void copy_context_before_encode(MpegEncContext
*d
, MpegEncContext
*s
, int type
){
1564 memcpy(d
->last_mv
, s
->last_mv
, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
1567 d
->mb_incr
= s
->mb_incr
;
1569 d
->last_dc
[i
]= s
->last_dc
[i
];
1572 d
->mv_bits
= s
->mv_bits
;
1573 d
->i_tex_bits
= s
->i_tex_bits
;
1574 d
->p_tex_bits
= s
->p_tex_bits
;
1575 d
->i_count
= s
->i_count
;
1576 d
->p_count
= s
->p_count
;
1577 d
->skip_count
= s
->skip_count
;
1578 d
->misc_bits
= s
->misc_bits
;
1581 d
->mb_skiped
= s
->mb_skiped
;
1584 static inline void copy_context_after_encode(MpegEncContext
*d
, MpegEncContext
*s
, int type
){
1587 memcpy(d
->mv
, s
->mv
, 2*4*2*sizeof(int));
1588 memcpy(d
->last_mv
, s
->last_mv
, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
1591 d
->mb_incr
= s
->mb_incr
;
1593 d
->last_dc
[i
]= s
->last_dc
[i
];
1596 d
->mv_bits
= s
->mv_bits
;
1597 d
->i_tex_bits
= s
->i_tex_bits
;
1598 d
->p_tex_bits
= s
->p_tex_bits
;
1599 d
->i_count
= s
->i_count
;
1600 d
->p_count
= s
->p_count
;
1601 d
->skip_count
= s
->skip_count
;
1602 d
->misc_bits
= s
->misc_bits
;
1604 d
->mb_intra
= s
->mb_intra
;
1605 d
->mb_skiped
= s
->mb_skiped
;
1606 d
->mv_type
= s
->mv_type
;
1607 d
->mv_dir
= s
->mv_dir
;
1609 if(s
->data_partitioning
){
1611 d
->tex_pb
= s
->tex_pb
;
1615 d
->block_last_index
[i
]= s
->block_last_index
[i
];
1618 static inline void encode_mb_hq(MpegEncContext
*s
, MpegEncContext
*backup
, MpegEncContext
*best
, int type
,
1619 PutBitContext pb
[2], PutBitContext pb2
[2], PutBitContext tex_pb
[2],
1620 int *dmin
, int *next_block
, int motion_x
, int motion_y
)
1624 copy_context_before_encode(s
, backup
, type
);
1626 s
->block
= s
->blocks
[*next_block
];
1627 s
->pb
= pb
[*next_block
];
1628 if(s
->data_partitioning
){
1629 s
->pb2
= pb2
[*next_block
];
1630 s
->tex_pb
= tex_pb
[*next_block
];
1633 encode_mb(s
, motion_x
, motion_y
);
1635 bits_count
= get_bit_count(&s
->pb
);
1636 if(s
->data_partitioning
){
1637 bits_count
+= get_bit_count(&s
->pb2
);
1638 bits_count
+= get_bit_count(&s
->tex_pb
);
1641 if(bits_count
<*dmin
){
1645 copy_context_after_encode(best
, s
, type
);
1649 static void encode_picture(MpegEncContext
*s
, int picture_number
)
1651 int mb_x
, mb_y
, last_gob
, pdif
= 0;
1654 MpegEncContext best_s
, backup_s
;
1655 UINT8 bit_buf
[2][3000];
1656 UINT8 bit_buf2
[2][3000];
1657 UINT8 bit_buf_tex
[2][3000];
1658 PutBitContext pb
[2], pb2
[2], tex_pb
[2];
1661 init_put_bits(&pb
[i
], bit_buf
[i
], 3000, NULL
, NULL
);
1662 init_put_bits(&pb2
[i
], bit_buf2
[i
], 3000, NULL
, NULL
);
1663 init_put_bits(&tex_pb
[i
], bit_buf_tex
[i
], 3000, NULL
, NULL
);
1666 s
->picture_number
= picture_number
;
1671 s
->block_wrap
[3]= s
->mb_width
*2 + 2;
1673 s
->block_wrap
[5]= s
->mb_width
+ 2;
1675 /* Reset the average MB variance */
1677 s
->mc_mb_var_sum
= 0;
1679 /* we need to initialize some time vars before we can encode b-frames */
1680 if (s
->h263_pred
&& !s
->h263_msmpeg4
)
1681 ff_set_mpeg4_time(s
, s
->picture_number
);
1683 /* Estimate motion for every MB */
1684 if(s
->pict_type
!= I_TYPE
){
1685 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
1686 s
->block_index
[0]= s
->block_wrap
[0]*(mb_y
*2 + 1) - 1;
1687 s
->block_index
[1]= s
->block_wrap
[0]*(mb_y
*2 + 1);
1688 s
->block_index
[2]= s
->block_wrap
[0]*(mb_y
*2 + 2) - 1;
1689 s
->block_index
[3]= s
->block_wrap
[0]*(mb_y
*2 + 2);
1690 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
1693 s
->block_index
[0]+=2;
1694 s
->block_index
[1]+=2;
1695 s
->block_index
[2]+=2;
1696 s
->block_index
[3]+=2;
1698 /* compute motion vector & mb_type and store in context */
1699 if(s
->pict_type
==B_TYPE
)
1700 ff_estimate_b_frame_motion(s
, mb_x
, mb_y
);
1702 ff_estimate_p_frame_motion(s
, mb_x
, mb_y
);
1703 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
1707 }else /* if(s->pict_type == I_TYPE) */{
1709 //FIXME do we need to zero them?
1710 memset(s
->motion_val
[0], 0, sizeof(INT16
)*(s
->mb_width
*2 + 2)*(s
->mb_height
*2 + 2)*2);
1711 memset(s
->p_mv_table
, 0, sizeof(INT16
)*(s
->mb_width
+2)*(s
->mb_height
+2)*2);
1712 memset(s
->mb_type
, MB_TYPE_INTRA
, sizeof(UINT8
)*s
->mb_width
*s
->mb_height
);
1715 if(s
->mb_var_sum
< s
->mc_mb_var_sum
&& s
->pict_type
== P_TYPE
){ //FIXME subtract MV bits
1716 s
->pict_type
= I_TYPE
;
1717 memset(s
->mb_type
, MB_TYPE_INTRA
, sizeof(UINT8
)*s
->mb_width
*s
->mb_height
);
1718 if(s
->max_b_frames
==0){
1719 s
->input_pict_type
= I_TYPE
;
1720 s
->input_picture_in_gop_number
=0;
1722 //printf("Scene change detected, encoding as I Frame\n");
1725 if(s
->pict_type
==P_TYPE
|| s
->pict_type
==S_TYPE
)
1726 s
->f_code
= ff_get_best_fcode(s
, s
->p_mv_table
, MB_TYPE_INTER
);
1727 ff_fix_long_p_mvs(s
);
1728 if(s
->pict_type
==B_TYPE
){
1729 s
->f_code
= ff_get_best_fcode(s
, s
->b_forw_mv_table
, MB_TYPE_FORWARD
);
1730 s
->b_code
= ff_get_best_fcode(s
, s
->b_back_mv_table
, MB_TYPE_BACKWARD
);
1732 ff_fix_long_b_mvs(s
, s
->b_forw_mv_table
, s
->f_code
, MB_TYPE_FORWARD
);
1733 ff_fix_long_b_mvs(s
, s
->b_back_mv_table
, s
->b_code
, MB_TYPE_BACKWARD
);
1734 ff_fix_long_b_mvs(s
, s
->b_bidir_forw_mv_table
, s
->f_code
, MB_TYPE_BIDIR
);
1735 ff_fix_long_b_mvs(s
, s
->b_bidir_back_mv_table
, s
->b_code
, MB_TYPE_BIDIR
);
1738 //printf("f_code %d ///\n", s->f_code);
1740 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var);
1742 if(s
->flags
&CODEC_FLAG_PASS2
)
1743 s
->qscale
= ff_rate_estimate_qscale_pass2(s
);
1744 else if (!s
->fixed_qscale
)
1745 s
->qscale
= ff_rate_estimate_qscale(s
);
1747 if (s
->out_format
== FMT_MJPEG
) {
1748 /* for mjpeg, we do include qscale in the matrix */
1749 s
->intra_matrix
[0] = default_intra_matrix
[0];
1751 s
->intra_matrix
[i
] = CLAMP_TO_8BIT((default_intra_matrix
[i
] * s
->qscale
) >> 3);
1752 convert_matrix(s
->q_intra_matrix
, s
->q_intra_matrix16
,
1753 s
->q_intra_matrix16_bias
, s
->intra_matrix
, s
->intra_quant_bias
);
1756 s
->last_bits
= get_bit_count(&s
->pb
);
1757 switch(s
->out_format
) {
1759 mjpeg_picture_header(s
);
1762 if (s
->h263_msmpeg4
)
1763 msmpeg4_encode_picture_header(s
, picture_number
);
1764 else if (s
->h263_pred
)
1765 mpeg4_encode_picture_header(s
, picture_number
);
1766 else if (s
->h263_rv10
)
1767 rv10_encode_picture_header(s
, picture_number
);
1769 h263_encode_picture_header(s
, picture_number
);
1772 mpeg1_encode_picture_header(s
, picture_number
);
1775 bits
= get_bit_count(&s
->pb
);
1776 s
->header_bits
= bits
- s
->last_bits
;
1786 /* init last dc values */
1787 /* note: quant matrix value (8) is implied here */
1788 s
->last_dc
[0] = 128;
1789 s
->last_dc
[1] = 128;
1790 s
->last_dc
[2] = 128;
1792 s
->last_mv
[0][0][0] = 0;
1793 s
->last_mv
[0][0][1] = 0;
1795 /* Get the GOB height based on picture height */
1796 if (s
->out_format
== FMT_H263
&& !s
->h263_pred
&& !s
->h263_msmpeg4
) {
1797 if (s
->height
<= 400)
1799 else if (s
->height
<= 800)
1803 }else if(s
->codec_id
==CODEC_ID_MPEG4
){
1807 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->data_partitioning
&& s
->pict_type
!=B_TYPE
)
1808 ff_mpeg4_init_partitions(s
);
1812 for(mb_y
=0; mb_y
< s
->mb_height
; mb_y
++) {
1813 /* Put GOB header based on RTP MTU for formats which support it per line (H263*)*/
1814 /* TODO: Put all this stuff in a separate generic function */
1817 s
->ptr_lastgob
= s
->pb
.buf
;
1818 s
->ptr_last_mb_line
= s
->pb
.buf
;
1819 } else if (s
->out_format
== FMT_H263
&& !s
->h263_pred
&& !s
->h263_msmpeg4
&& !(mb_y
% s
->gob_index
)) {
1820 // MN: we could move the space check from h263 -> here, as its not h263 specific
1821 last_gob
= h263_encode_gob_header(s
, mb_y
);
1823 s
->first_slice_line
= 1;
1825 /*MN: we reset it here instead at the end of each line cuz mpeg4 can have
1826 slice lines starting & ending in the middle*/
1827 s
->first_slice_line
= 0;
1832 s
->block_index
[0]= s
->block_wrap
[0]*(mb_y
*2 + 1) - 1;
1833 s
->block_index
[1]= s
->block_wrap
[0]*(mb_y
*2 + 1);
1834 s
->block_index
[2]= s
->block_wrap
[0]*(mb_y
*2 + 2) - 1;
1835 s
->block_index
[3]= s
->block_wrap
[0]*(mb_y
*2 + 2);
1836 s
->block_index
[4]= s
->block_wrap
[4]*(mb_y
+ 1) + s
->block_wrap
[0]*(s
->mb_height
*2 + 2);
1837 s
->block_index
[5]= s
->block_wrap
[4]*(mb_y
+ 1 + s
->mb_height
+ 2) + s
->block_wrap
[0]*(s
->mb_height
*2 + 2);
1838 for(mb_x
=0; mb_x
< s
->mb_width
; mb_x
++) {
1839 const int mb_type
= s
->mb_type
[mb_y
* s
->mb_width
+ mb_x
];
1840 const int xy
= (mb_y
+1) * (s
->mb_width
+2) + mb_x
+ 1;
1846 s
->block_index
[0]+=2;
1847 s
->block_index
[1]+=2;
1848 s
->block_index
[2]+=2;
1849 s
->block_index
[3]+=2;
1850 s
->block_index
[4]++;
1851 s
->block_index
[5]++;
1853 /* write gob / video packet header for formats which support it at any MB (MPEG4) */
1854 if(s
->rtp_mode
&& s
->mb_y
>0 && s
->codec_id
==CODEC_ID_MPEG4
){
1855 int pdif
= pbBufPtr(&s
->pb
) - s
->ptr_lastgob
;
1857 //the *2 is there so we stay below the requested size
1858 if(pdif
+ s
->mb_line_avgsize
/s
->mb_width
>= s
->rtp_payload_size
){
1859 if(s
->codec_id
==CODEC_ID_MPEG4
){
1860 if(s
->data_partitioning
&& s
->pict_type
!=B_TYPE
){
1861 ff_mpeg4_merge_partitions(s
);
1862 ff_mpeg4_init_partitions(s
);
1864 ff_mpeg4_encode_video_packet_header(s
);
1866 if(s
->flags
&CODEC_FLAG_PASS1
){
1867 int bits
= get_bit_count(&s
->pb
);
1868 s
->misc_bits
+= bits
- s
->last_bits
;
1871 ff_mpeg4_clean_buffers(s
);
1873 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
1874 s
->first_slice_line
=1;
1875 s
->resync_mb_x
=mb_x
;
1876 s
->resync_mb_y
=mb_y
;
1879 if( (s
->resync_mb_x
== s
->mb_x
)
1880 && s
->resync_mb_y
+1 == s
->mb_y
){
1881 s
->first_slice_line
=0;
1885 if(mb_type
& (mb_type
-1)){ // more than 1 MB type possible
1887 int pb_bits_count
, pb2_bits_count
, tex_pb_bits_count
;
1889 copy_context_before_encode(&backup_s
, s
, -1);
1891 best_s
.data_partitioning
= s
->data_partitioning
;
1892 if(s
->data_partitioning
){
1893 backup_s
.pb2
= s
->pb2
;
1894 backup_s
.tex_pb
= s
->tex_pb
;
1897 if(mb_type
&MB_TYPE_INTER
){
1898 s
->mv_dir
= MV_DIR_FORWARD
;
1899 s
->mv_type
= MV_TYPE_16X16
;
1901 s
->mv
[0][0][0] = s
->p_mv_table
[xy
][0];
1902 s
->mv
[0][0][1] = s
->p_mv_table
[xy
][1];
1903 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTER
, pb
, pb2
, tex_pb
,
1904 &dmin
, &next_block
, s
->mv
[0][0][0], s
->mv
[0][0][1]);
1906 if(mb_type
&MB_TYPE_INTER4V
){
1907 s
->mv_dir
= MV_DIR_FORWARD
;
1908 s
->mv_type
= MV_TYPE_8X8
;
1911 s
->mv
[0][i
][0] = s
->motion_val
[s
->block_index
[i
]][0];
1912 s
->mv
[0][i
][1] = s
->motion_val
[s
->block_index
[i
]][1];
1914 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTER4V
, pb
, pb2
, tex_pb
,
1915 &dmin
, &next_block
, 0, 0);
1917 if(mb_type
&MB_TYPE_FORWARD
){
1918 s
->mv_dir
= MV_DIR_FORWARD
;
1919 s
->mv_type
= MV_TYPE_16X16
;
1921 s
->mv
[0][0][0] = s
->b_forw_mv_table
[xy
][0];
1922 s
->mv
[0][0][1] = s
->b_forw_mv_table
[xy
][1];
1923 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_FORWARD
, pb
, pb2
, tex_pb
,
1924 &dmin
, &next_block
, s
->mv
[0][0][0], s
->mv
[0][0][1]);
1926 if(mb_type
&MB_TYPE_BACKWARD
){
1927 s
->mv_dir
= MV_DIR_BACKWARD
;
1928 s
->mv_type
= MV_TYPE_16X16
;
1930 s
->mv
[1][0][0] = s
->b_back_mv_table
[xy
][0];
1931 s
->mv
[1][0][1] = s
->b_back_mv_table
[xy
][1];
1932 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_BACKWARD
, pb
, pb2
, tex_pb
,
1933 &dmin
, &next_block
, s
->mv
[1][0][0], s
->mv
[1][0][1]);
1935 if(mb_type
&MB_TYPE_BIDIR
){
1936 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
;
1937 s
->mv_type
= MV_TYPE_16X16
;
1939 s
->mv
[0][0][0] = s
->b_bidir_forw_mv_table
[xy
][0];
1940 s
->mv
[0][0][1] = s
->b_bidir_forw_mv_table
[xy
][1];
1941 s
->mv
[1][0][0] = s
->b_bidir_back_mv_table
[xy
][0];
1942 s
->mv
[1][0][1] = s
->b_bidir_back_mv_table
[xy
][1];
1943 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_BIDIR
, pb
, pb2
, tex_pb
,
1944 &dmin
, &next_block
, 0, 0);
1946 if(mb_type
&MB_TYPE_DIRECT
){
1947 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
| MV_DIRECT
;
1948 s
->mv_type
= MV_TYPE_16X16
; //FIXME
1950 s
->mv
[0][0][0] = s
->b_direct_forw_mv_table
[xy
][0];
1951 s
->mv
[0][0][1] = s
->b_direct_forw_mv_table
[xy
][1];
1952 s
->mv
[1][0][0] = s
->b_direct_back_mv_table
[xy
][0];
1953 s
->mv
[1][0][1] = s
->b_direct_back_mv_table
[xy
][1];
1954 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_DIRECT
, pb
, pb2
, tex_pb
,
1955 &dmin
, &next_block
, s
->b_direct_mv_table
[xy
][0], s
->b_direct_mv_table
[xy
][1]);
1957 if(mb_type
&MB_TYPE_INTRA
){
1958 s
->mv_dir
= MV_DIR_FORWARD
;
1959 s
->mv_type
= MV_TYPE_16X16
;
1963 encode_mb_hq(s
, &backup_s
, &best_s
, MB_TYPE_INTRA
, pb
, pb2
, tex_pb
,
1964 &dmin
, &next_block
, 0, 0);
1965 /* force cleaning of ac/dc pred stuff if needed ... */
1966 if(s
->h263_pred
|| s
->h263_aic
)
1967 s
->mbintra_table
[mb_x
+ mb_y
*s
->mb_width
]=1;
1969 copy_context_after_encode(s
, &best_s
, -1);
1971 pb_bits_count
= get_bit_count(&s
->pb
);
1972 flush_put_bits(&s
->pb
);
1973 ff_copy_bits(&backup_s
.pb
, bit_buf
[next_block
^1], pb_bits_count
);
1976 if(s
->data_partitioning
){
1977 pb2_bits_count
= get_bit_count(&s
->pb2
);
1978 flush_put_bits(&s
->pb2
);
1979 ff_copy_bits(&backup_s
.pb2
, bit_buf2
[next_block
^1], pb2_bits_count
);
1980 s
->pb2
= backup_s
.pb2
;
1982 tex_pb_bits_count
= get_bit_count(&s
->tex_pb
);
1983 flush_put_bits(&s
->tex_pb
);
1984 ff_copy_bits(&backup_s
.tex_pb
, bit_buf_tex
[next_block
^1], tex_pb_bits_count
);
1985 s
->tex_pb
= backup_s
.tex_pb
;
1987 s
->last_bits
= get_bit_count(&s
->pb
);
1989 int motion_x
, motion_y
;
1990 s
->mv_type
=MV_TYPE_16X16
;
1991 // only one MB-Type possible
1994 s
->mv_dir
= MV_DIR_FORWARD
;
1996 motion_x
= s
->mv
[0][0][0] = 0;
1997 motion_y
= s
->mv
[0][0][1] = 0;
2000 s
->mv_dir
= MV_DIR_FORWARD
;
2002 motion_x
= s
->mv
[0][0][0] = s
->p_mv_table
[xy
][0];
2003 motion_y
= s
->mv
[0][0][1] = s
->p_mv_table
[xy
][1];
2005 case MB_TYPE_INTER4V
:
2006 s
->mv_dir
= MV_DIR_FORWARD
;
2007 s
->mv_type
= MV_TYPE_8X8
;
2010 s
->mv
[0][i
][0] = s
->motion_val
[s
->block_index
[i
]][0];
2011 s
->mv
[0][i
][1] = s
->motion_val
[s
->block_index
[i
]][1];
2013 motion_x
= motion_y
= 0;
2015 case MB_TYPE_DIRECT
:
2016 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
| MV_DIRECT
;
2018 motion_x
=s
->b_direct_mv_table
[xy
][0];
2019 motion_y
=s
->b_direct_mv_table
[xy
][1];
2020 s
->mv
[0][0][0] = s
->b_direct_forw_mv_table
[xy
][0];
2021 s
->mv
[0][0][1] = s
->b_direct_forw_mv_table
[xy
][1];
2022 s
->mv
[1][0][0] = s
->b_direct_back_mv_table
[xy
][0];
2023 s
->mv
[1][0][1] = s
->b_direct_back_mv_table
[xy
][1];
2026 s
->mv_dir
= MV_DIR_FORWARD
| MV_DIR_BACKWARD
;
2030 s
->mv
[0][0][0] = s
->b_bidir_forw_mv_table
[xy
][0];
2031 s
->mv
[0][0][1] = s
->b_bidir_forw_mv_table
[xy
][1];
2032 s
->mv
[1][0][0] = s
->b_bidir_back_mv_table
[xy
][0];
2033 s
->mv
[1][0][1] = s
->b_bidir_back_mv_table
[xy
][1];
2035 case MB_TYPE_BACKWARD
:
2036 s
->mv_dir
= MV_DIR_BACKWARD
;
2038 motion_x
= s
->mv
[1][0][0] = s
->b_back_mv_table
[xy
][0];
2039 motion_y
= s
->mv
[1][0][1] = s
->b_back_mv_table
[xy
][1];
2041 case MB_TYPE_FORWARD
:
2042 s
->mv_dir
= MV_DIR_FORWARD
;
2044 motion_x
= s
->mv
[0][0][0] = s
->b_forw_mv_table
[xy
][0];
2045 motion_y
= s
->mv
[0][0][1] = s
->b_forw_mv_table
[xy
][1];
2046 // printf(" %d %d ", motion_x, motion_y);
2049 motion_x
=motion_y
=0; //gcc warning fix
2050 printf("illegal MB type\n");
2052 encode_mb(s
, motion_x
, motion_y
);
2054 /* clean the MV table in IPS frames for direct mode in B frames */
2055 if(s
->mb_intra
/* && I,P,S_TYPE */){
2056 s
->p_mv_table
[xy
][0]=0;
2057 s
->p_mv_table
[xy
][1]=0;
2060 MPV_decode_mb(s
, s
->block
);
2061 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_width, get_bit_count(&s->pb));
2065 /* Obtain average GOB size for RTP */
2068 s
->mb_line_avgsize
= pbBufPtr(&s
->pb
) - s
->ptr_last_mb_line
;
2069 else if (!(mb_y
% s
->gob_index
)) {
2070 s
->mb_line_avgsize
= (s
->mb_line_avgsize
+ pbBufPtr(&s
->pb
) - s
->ptr_last_mb_line
) >> 1;
2071 s
->ptr_last_mb_line
= pbBufPtr(&s
->pb
);
2073 //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y,
2074 // (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize);
2075 if(s
->codec_id
!=CODEC_ID_MPEG4
) s
->first_slice_line
= 0; //FIXME clean
2080 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->data_partitioning
&& s
->pict_type
!=B_TYPE
)
2081 ff_mpeg4_merge_partitions(s
);
2083 if (s
->msmpeg4_version
&& s
->msmpeg4_version
<4 && s
->pict_type
== I_TYPE
)
2084 msmpeg4_encode_ext_header(s
);
2086 if(s
->codec_id
==CODEC_ID_MPEG4
)
2087 ff_mpeg4_stuffing(&s
->pb
);
2089 //if (s->gob_number)
2090 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
2092 /* Send the last GOB if RTP */
2094 flush_put_bits(&s
->pb
);
2095 pdif
= pbBufPtr(&s
->pb
) - s
->ptr_lastgob
;
2096 /* Call the RTP callback to send the last GOB */
2097 if (s
->rtp_callback
)
2098 s
->rtp_callback(s
->ptr_lastgob
, pdif
, s
->gob_number
);
2099 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
2100 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
2104 static int dct_quantize_c(MpegEncContext
*s
,
2105 DCTELEM
*block
, int n
,
2106 int qscale
, int *overflow
)
2108 int i
, j
, level
, last_non_zero
, q
;
2112 unsigned int threshold1
, threshold2
;
2116 /* we need this permutation so that we correct the IDCT
2117 permutation. will be moved into DCT code */
2118 block_permute(block
);
2128 /* For AIC we skip quant/dequant of INTRADC */
2131 /* note: block[0] is assumed to be positive */
2132 block
[0] = (block
[0] + (q
>> 1)) / q
;
2135 qmat
= s
->q_intra_matrix
[qscale
];
2136 bias
= s
->intra_quant_bias
<<(QMAT_SHIFT
- 3 - QUANT_BIAS_SHIFT
);
2140 qmat
= s
->q_inter_matrix
[qscale
];
2141 bias
= s
->inter_quant_bias
<<(QMAT_SHIFT
- 3 - QUANT_BIAS_SHIFT
);
2143 threshold1
= (1<<(QMAT_SHIFT
- 3)) - bias
- 1;
2144 threshold2
= threshold1
<<1;
2147 j
= zigzag_direct
[i
];
2149 level
= level
* qmat
[j
];
2151 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
2152 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
2153 if(((unsigned)(level
+threshold1
))>threshold2
){
2155 level
= (bias
+ level
)>>(QMAT_SHIFT
- 3);
2158 level
= (bias
- level
)>>(QMAT_SHIFT
- 3);
2167 *overflow
= s
->max_qcoeff
< max
; //overflow might have happend
2169 return last_non_zero
;
2172 static void dct_unquantize_mpeg1_c(MpegEncContext
*s
,
2173 DCTELEM
*block
, int n
, int qscale
)
2175 int i
, level
, nCoeffs
;
2176 const UINT16
*quant_matrix
;
2178 if(s
->alternate_scan
) nCoeffs
= 64;
2179 else nCoeffs
= s
->block_last_index
[n
]+1;
2183 block
[0] = block
[0] * s
->y_dc_scale
;
2185 block
[0] = block
[0] * s
->c_dc_scale
;
2186 /* XXX: only mpeg1 */
2187 quant_matrix
= s
->intra_matrix
;
2188 for(i
=1;i
<nCoeffs
;i
++) {
2189 int j
= zigzag_direct
[i
];
2194 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2195 level
= (level
- 1) | 1;
2198 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2199 level
= (level
- 1) | 1;
2202 if (level
< -2048 || level
> 2047)
2203 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2210 quant_matrix
= s
->inter_matrix
;
2211 for(;i
<nCoeffs
;i
++) {
2212 int j
= zigzag_direct
[i
];
2217 level
= (((level
<< 1) + 1) * qscale
*
2218 ((int) (quant_matrix
[j
]))) >> 4;
2219 level
= (level
- 1) | 1;
2222 level
= (((level
<< 1) + 1) * qscale
*
2223 ((int) (quant_matrix
[j
]))) >> 4;
2224 level
= (level
- 1) | 1;
2227 if (level
< -2048 || level
> 2047)
2228 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2236 static void dct_unquantize_mpeg2_c(MpegEncContext
*s
,
2237 DCTELEM
*block
, int n
, int qscale
)
2239 int i
, level
, nCoeffs
;
2240 const UINT16
*quant_matrix
;
2242 if(s
->alternate_scan
) nCoeffs
= 64;
2243 else nCoeffs
= s
->block_last_index
[n
]+1;
2247 block
[0] = block
[0] * s
->y_dc_scale
;
2249 block
[0] = block
[0] * s
->c_dc_scale
;
2250 quant_matrix
= s
->intra_matrix
;
2251 for(i
=1;i
<nCoeffs
;i
++) {
2252 int j
= zigzag_direct
[i
];
2257 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2260 level
= (int)(level
* qscale
* quant_matrix
[j
]) >> 3;
2263 if (level
< -2048 || level
> 2047)
2264 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2272 quant_matrix
= s
->inter_matrix
;
2273 for(;i
<nCoeffs
;i
++) {
2274 int j
= zigzag_direct
[i
];
2279 level
= (((level
<< 1) + 1) * qscale
*
2280 ((int) (quant_matrix
[j
]))) >> 4;
2283 level
= (((level
<< 1) + 1) * qscale
*
2284 ((int) (quant_matrix
[j
]))) >> 4;
2287 if (level
< -2048 || level
> 2047)
2288 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2299 static void dct_unquantize_h263_c(MpegEncContext
*s
,
2300 DCTELEM
*block
, int n
, int qscale
)
2302 int i
, level
, qmul
, qadd
;
2308 block
[0] = block
[0] * s
->y_dc_scale
;
2310 block
[0] = block
[0] * s
->c_dc_scale
;
2313 nCoeffs
= 64; //does not allways use zigzag table
2316 nCoeffs
= zigzag_end
[ s
->block_last_index
[n
] ];
2319 qmul
= s
->qscale
<< 1;
2320 if (s
->h263_aic
&& s
->mb_intra
)
2323 qadd
= (s
->qscale
- 1) | 1;
2325 for(;i
<nCoeffs
;i
++) {
2329 level
= level
* qmul
- qadd
;
2331 level
= level
* qmul
+ qadd
;
2334 if (level
< -2048 || level
> 2047)
2335 fprintf(stderr
, "unquant error %d %d\n", i
, level
);
2342 static void remove_ac(MpegEncContext
*s
, uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
, int mb_x
, int mb_y
)
2344 int dc
, dcb
, dcr
, y
, i
;
2346 dc
= s
->dc_val
[0][mb_x
*2+1 + (i
&1) + (mb_y
*2+1 + (i
>>1))*(s
->mb_width
*2+2)];
2350 dest_y
[x
+ (i
&1)*8 + (y
+ (i
>>1)*8)*s
->linesize
]= dc
/8;
2354 dcb
= s
->dc_val
[1][mb_x
+1 + (mb_y
+1)*(s
->mb_width
+2)];
2355 dcr
= s
->dc_val
[2][mb_x
+1 + (mb_y
+1)*(s
->mb_width
+2)];
2359 dest_cb
[x
+ y
*(s
->linesize
>>1)]= dcb
/8;
2360 dest_cr
[x
+ y
*(s
->linesize
>>1)]= dcr
/8;
2366 * will conceal past errors, and allso drop b frames if needed
2369 void ff_conceal_past_errors(MpegEncContext
*s
, int unknown_pos
)
2374 int i
, intra_count
=0, inter_count
=0;
2375 int intra_conceal
= s
->msmpeg4_version ?
50 : 50; //FIXME finetune
2376 int inter_conceal
= s
->msmpeg4_version ?
50 : 50;
2379 if(mb_x
>=s
->mb_width
) mb_x
= s
->mb_width
-1;
2380 if(mb_y
>=s
->mb_height
) mb_y
= s
->mb_height
-1;
2382 if(s
->decoding_error
==0 && unknown_pos
){
2383 if(s
->data_partitioning
&& s
->pict_type
!=B_TYPE
)
2384 s
->decoding_error
= DECODING_AC_LOST
;
2386 s
->decoding_error
= DECODING_DESYNC
;
2389 if(s
->decoding_error
==DECODING_DESYNC
&& s
->pict_type
!=B_TYPE
) s
->next_p_frame_damaged
=1;
2391 for(i
=mb_x
+ mb_y
*s
->mb_width
; i
>=0; i
--){
2392 if(s
->mbintra_table
[i
]) intra_count
++;
2396 if(s
->decoding_error
==DECODING_AC_LOST
){
2399 }else if(s
->decoding_error
==DECODING_ACDC_LOST
){
2404 if(unknown_pos
&& (intra_count
<inter_count
)){
2405 intra_conceal
= inter_conceal
= s
->mb_num
;
2406 // printf("%d %d\n",intra_count, inter_count);
2409 fprintf(stderr
, "concealing errors\n");
2411 /* for all MBs from the current one back until the last resync marker */
2412 for(; mb_y
>=0 && mb_y
>=s
->resync_mb_y
; mb_y
--){
2413 for(; mb_x
>=0; mb_x
--){
2414 uint8_t *dest_y
= s
->current_picture
[0] + (mb_y
* 16* s
->linesize
) + mb_x
* 16;
2415 uint8_t *dest_cb
= s
->current_picture
[1] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
2416 uint8_t *dest_cr
= s
->current_picture
[2] + (mb_y
* 8 * (s
->linesize
>> 1)) + mb_x
* 8;
2417 int mb_x_backup
= s
->mb_x
; //FIXME pass xy to mpeg_motion
2418 int mb_y_backup
= s
->mb_y
;
2421 if(s
->mbintra_table
[mb_y
*s
->mb_width
+ mb_x
] && mb_dist
<intra_conceal
){
2422 if(s
->decoding_error
==DECODING_AC_LOST
){
2423 remove_ac(s
, dest_y
, dest_cb
, dest_cr
, mb_x
, mb_y
);
2424 // printf("remove ac to %d %d\n", mb_x, mb_y);
2426 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
2427 s
->last_picture
, 0, 0, put_pixels_tab
,
2428 0/*mx*/, 0/*my*/, 16);
2431 else if(!s
->mbintra_table
[mb_y
*s
->mb_width
+ mb_x
] && mb_dist
<inter_conceal
){
2435 if(s
->decoding_error
!=DECODING_DESYNC
){
2436 int xy
= mb_x
*2+1 + (mb_y
*2+1)*(s
->mb_width
*2+2);
2437 mx
= s
->motion_val
[ xy
][0];
2438 my
= s
->motion_val
[ xy
][1];
2441 mpeg_motion(s
, dest_y
, dest_cb
, dest_cr
, 0,
2442 s
->last_picture
, 0, 0, put_pixels_tab
,
2445 s
->mb_x
= mb_x_backup
;
2446 s
->mb_y
= mb_y_backup
;
2448 if(mb_x
== s
->resync_mb_x
&& mb_y
== s
->resync_mb_y
) return;
2449 if(!s
->mbskip_table
[mb_x
+ mb_y
*s
->mb_width
]) mb_dist
++;
2455 AVCodec mpeg1video_encoder
= {
2458 CODEC_ID_MPEG1VIDEO
,
2459 sizeof(MpegEncContext
),
2465 AVCodec h263_encoder
= {
2469 sizeof(MpegEncContext
),
2475 AVCodec h263p_encoder
= {
2479 sizeof(MpegEncContext
),
2485 AVCodec rv10_encoder
= {
2489 sizeof(MpegEncContext
),
2495 AVCodec mjpeg_encoder
= {
2499 sizeof(MpegEncContext
),
2505 AVCodec mpeg4_encoder
= {
2509 sizeof(MpegEncContext
),
2515 AVCodec msmpeg4v1_encoder
= {
2519 sizeof(MpegEncContext
),
2525 AVCodec msmpeg4v2_encoder
= {
2529 sizeof(MpegEncContext
),
2535 AVCodec msmpeg4v3_encoder
= {
2539 sizeof(MpegEncContext
),