2
* The simplest mpeg encoder (well, it was the simplest!)
3
* Copyright (c) 2000,2001 Fabrice Bellard
4
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6
* 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8
* This file is part of Libav.
10
* Libav is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU Lesser General Public
12
* License as published by the Free Software Foundation; either
13
* version 2.1 of the License, or (at your option) any later version.
15
* Libav is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
* Lesser General Public License for more details.
20
* You should have received a copy of the GNU Lesser General Public
21
* License along with Libav; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27
* The simplest mpeg encoder (well, it was the simplest!).
30
#include "libavutil/intmath.h"
31
#include "libavutil/imgutils.h"
35
#include "mpegvideo.h"
36
#include "mpegvideo_common.h"
40
#include "xvmc_internal.h"
47
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
48
DCTELEM *block, int n, int qscale);
49
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
50
DCTELEM *block, int n, int qscale);
51
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
52
DCTELEM *block, int n, int qscale);
53
static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
54
DCTELEM *block, int n, int qscale);
55
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
56
DCTELEM *block, int n, int qscale);
57
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
58
DCTELEM *block, int n, int qscale);
59
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
60
DCTELEM *block, int n, int qscale);
63
/* enable all paranoid tests for rounding, overflows, etc... */
69
static const uint8_t ff_default_chroma_qscale_table[32]={
70
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
71
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
74
const uint8_t ff_mpeg1_dc_scale_table[128]={
75
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
76
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
77
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
78
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
79
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
82
static const uint8_t mpeg2_dc_scale_table1[128]={
83
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
84
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
85
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
86
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
87
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90
static const uint8_t mpeg2_dc_scale_table2[128]={
91
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
92
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
93
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
94
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98
static const uint8_t mpeg2_dc_scale_table3[128]={
99
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
100
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
101
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
102
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
103
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106
const uint8_t * const ff_mpeg2_dc_scale_table[4]={
107
ff_mpeg1_dc_scale_table,
108
mpeg2_dc_scale_table1,
109
mpeg2_dc_scale_table2,
110
mpeg2_dc_scale_table3,
113
const enum PixelFormat ff_pixfmt_list_420[] = {
118
const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = {
125
const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
133
uint32_t tmp= *state << 8;
134
*state= tmp + *(p++);
135
if(tmp == 0x100 || p==end)
140
if (p[-1] > 1 ) p+= 3;
141
else if(p[-2] ) p+= 2;
142
else if(p[-3]|(p[-1]-1)) p++;
155
/* init common dct for both encoder and decoder */
156
av_cold int ff_dct_common_init(MpegEncContext *s)
158
s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
159
s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
160
s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
161
s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
162
s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
163
if(s->flags & CODEC_FLAG_BITEXACT)
164
s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
165
s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
168
MPV_common_init_mmx(s);
170
MPV_common_init_axp(s);
172
MPV_common_init_mlib(s);
174
MPV_common_init_mmi(s);
176
MPV_common_init_arm(s);
178
MPV_common_init_altivec(s);
180
MPV_common_init_bfin(s);
183
/* load & permutate scantables
184
note: only wmv uses different ones
186
if(s->alternate_scan){
187
ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
188
ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
190
ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
191
ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
193
ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
194
ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
199
void ff_copy_picture(Picture *dst, Picture *src){
201
dst->type= FF_BUFFER_TYPE_COPY;
205
* Release a frame buffer
207
static void free_frame_buffer(MpegEncContext *s, Picture *pic)
209
ff_thread_release_buffer(s->avctx, (AVFrame*)pic);
210
av_freep(&pic->hwaccel_picture_private);
214
* Allocate a frame buffer
216
static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
220
if (s->avctx->hwaccel) {
221
assert(!pic->hwaccel_picture_private);
222
if (s->avctx->hwaccel->priv_data_size) {
223
pic->hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
224
if (!pic->hwaccel_picture_private) {
225
av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
231
r = ff_thread_get_buffer(s->avctx, (AVFrame*)pic);
233
if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
234
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
235
av_freep(&pic->hwaccel_picture_private);
239
if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) {
240
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
241
free_frame_buffer(s, pic);
245
if (pic->linesize[1] != pic->linesize[2]) {
246
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
247
free_frame_buffer(s, pic);
255
* allocates a Picture
256
* The pixels are allocated/set by calling get_buffer() if shared=0
258
int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){
259
const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
260
const int mb_array_size= s->mb_stride*s->mb_height;
261
const int b8_array_size= s->b8_stride*s->mb_height*2;
262
const int b4_array_size= s->b4_stride*s->mb_height*4;
267
assert(pic->data[0]);
268
assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
269
pic->type= FF_BUFFER_TYPE_SHARED;
271
assert(!pic->data[0]);
273
if (alloc_frame_buffer(s, pic) < 0)
276
s->linesize = pic->linesize[0];
277
s->uvlinesize= pic->linesize[1];
280
if(pic->qscale_table==NULL){
282
FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var , mb_array_size * sizeof(int16_t) , fail)
283
FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t) , fail)
284
FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean , mb_array_size * sizeof(int8_t ) , fail)
287
FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check
288
FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t) , fail)
289
FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail)
290
pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1;
291
if(s->out_format == FMT_H264){
293
FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t), fail)
294
pic->motion_val[i]= pic->motion_val_base[i]+4;
295
FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
297
pic->motion_subsample_log2= 2;
298
}else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
300
FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail)
301
pic->motion_val[i]= pic->motion_val_base[i]+4;
302
FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
304
pic->motion_subsample_log2= 3;
306
if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
307
FF_ALLOCZ_OR_GOTO(s->avctx, pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6, fail)
309
pic->qstride= s->mb_stride;
310
FF_ALLOCZ_OR_GOTO(s->avctx, pic->pan_scan , 1 * sizeof(AVPanScan), fail)
313
/* It might be nicer if the application would keep track of these
314
* but it would require an API change. */
315
memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
316
s->prev_pict_types[0]= s->dropable ? AV_PICTURE_TYPE_B : s->pict_type;
317
if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == AV_PICTURE_TYPE_B)
318
pic->age= INT_MAX; // Skipped MBs in B-frames are quite rare in MPEG-1/2 and it is a bit tricky to skip them anyway.
322
fail: //for the FF_ALLOCZ_OR_GOTO macro
324
free_frame_buffer(s, pic);
329
* deallocates a picture
331
static void free_picture(MpegEncContext *s, Picture *pic){
334
if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
335
free_frame_buffer(s, pic);
338
av_freep(&pic->mb_var);
339
av_freep(&pic->mc_mb_var);
340
av_freep(&pic->mb_mean);
341
av_freep(&pic->mbskip_table);
342
av_freep(&pic->qscale_table);
343
av_freep(&pic->mb_type_base);
344
av_freep(&pic->dct_coeff);
345
av_freep(&pic->pan_scan);
348
av_freep(&pic->motion_val_base[i]);
349
av_freep(&pic->ref_index[i]);
352
if(pic->type == FF_BUFFER_TYPE_SHARED){
361
static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
362
int y_size = s->b8_stride * (2 * s->mb_height + 1);
363
int c_size = s->mb_stride * (s->mb_height + 1);
364
int yc_size = y_size + 2 * c_size;
367
// edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
368
FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
369
s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
371
//FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
372
FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail)
373
s->me.temp= s->me.scratchpad;
374
s->rd_scratchpad= s->me.scratchpad;
375
s->b_scratchpad= s->me.scratchpad;
376
s->obmc_scratchpad= s->me.scratchpad + 16;
378
FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map , ME_MAP_SIZE*sizeof(uint32_t), fail)
379
FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail)
380
if(s->avctx->noise_reduction){
381
FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail)
384
FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail)
385
s->block= s->blocks[0];
388
s->pblocks[i] = &s->block[i];
391
if (s->out_format == FMT_H263) {
393
FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
394
s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
395
s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
396
s->ac_val[2] = s->ac_val[1] + c_size;
401
return -1; //free() through MPV_common_end()
404
static void free_duplicate_context(MpegEncContext *s){
407
av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
408
av_freep(&s->me.scratchpad);
412
s->obmc_scratchpad= NULL;
414
av_freep(&s->dct_error_sum);
415
av_freep(&s->me.map);
416
av_freep(&s->me.score_map);
417
av_freep(&s->blocks);
418
av_freep(&s->ac_val_base);
422
static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
423
#define COPY(a) bak->a= src->a
424
COPY(allocated_edge_emu_buffer);
425
COPY(edge_emu_buffer);
430
COPY(obmc_scratchpad);
437
COPY(me.map_generation);
449
void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
452
//FIXME copy only needed parts
454
backup_duplicate_context(&bak, dst);
455
memcpy(dst, src, sizeof(MpegEncContext));
456
backup_duplicate_context(dst, &bak);
458
dst->pblocks[i] = &dst->block[i];
460
//STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
463
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
465
MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
467
if(dst == src || !s1->context_initialized) return 0;
469
//FIXME can parameters change on I-frames? in that case dst may need a reinit
470
if(!s->context_initialized){
471
memcpy(s, s1, sizeof(MpegEncContext));
474
s->picture_range_start += MAX_PICTURE_COUNT;
475
s->picture_range_end += MAX_PICTURE_COUNT;
476
s->bitstream_buffer = NULL;
477
s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
482
s->avctx->coded_height = s1->avctx->coded_height;
483
s->avctx->coded_width = s1->avctx->coded_width;
484
s->avctx->width = s1->avctx->width;
485
s->avctx->height = s1->avctx->height;
487
s->coded_picture_number = s1->coded_picture_number;
488
s->picture_number = s1->picture_number;
489
s->input_picture_number = s1->input_picture_number;
491
memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
492
memcpy(&s->last_picture, &s1->last_picture, (char*)&s1->last_picture_ptr - (char*)&s1->last_picture);
494
s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
495
s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
496
s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
498
memcpy(s->prev_pict_types, s1->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
500
//Error/bug resilience
501
s->next_p_frame_damaged = s1->next_p_frame_damaged;
502
s->workaround_bugs = s1->workaround_bugs;
505
memcpy(&s->time_increment_bits, &s1->time_increment_bits, (char*)&s1->shape - (char*)&s1->time_increment_bits);
508
s->max_b_frames = s1->max_b_frames;
509
s->low_delay = s1->low_delay;
510
s->dropable = s1->dropable;
512
//DivX handling (doesn't work)
513
s->divx_packed = s1->divx_packed;
515
if(s1->bitstream_buffer){
516
if (s1->bitstream_buffer_size + FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
517
av_fast_malloc(&s->bitstream_buffer, &s->allocated_bitstream_buffer_size, s1->allocated_bitstream_buffer_size);
518
s->bitstream_buffer_size = s1->bitstream_buffer_size;
519
memcpy(s->bitstream_buffer, s1->bitstream_buffer, s1->bitstream_buffer_size);
520
memset(s->bitstream_buffer+s->bitstream_buffer_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
523
//MPEG2/interlacing info
524
memcpy(&s->progressive_sequence, &s1->progressive_sequence, (char*)&s1->rtp_mode - (char*)&s1->progressive_sequence);
526
if(!s1->first_field){
527
s->last_pict_type= s1->pict_type;
528
if (s1->current_picture_ptr) s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->quality;
530
if(s1->pict_type!=FF_B_TYPE){
531
s->last_non_b_pict_type= s1->pict_type;
539
* sets the given MpegEncContext to common defaults (same for encoding and decoding).
540
* the changed fields will not depend upon the prior state of the MpegEncContext.
542
void MPV_common_defaults(MpegEncContext *s){
544
s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
545
s->chroma_qscale_table= ff_default_chroma_qscale_table;
546
s->progressive_frame= 1;
547
s->progressive_sequence= 1;
548
s->picture_structure= PICT_FRAME;
550
s->coded_picture_number = 0;
551
s->picture_number = 0;
552
s->input_picture_number = 0;
554
s->picture_in_gop_number = 0;
559
s->picture_range_start = 0;
560
s->picture_range_end = MAX_PICTURE_COUNT;
564
* sets the given MpegEncContext to defaults for decoding.
565
* the changed fields will not depend upon the prior state of the MpegEncContext.
567
void MPV_decode_defaults(MpegEncContext *s){
568
MPV_common_defaults(s);
572
* init common structure for both encoder and decoder.
573
* this assumes that some variables like width/height are already set
575
av_cold int MPV_common_init(MpegEncContext *s)
577
int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads;
579
if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
580
s->mb_height = (s->height + 31) / 32 * 2;
581
else if (s->codec_id != CODEC_ID_H264)
582
s->mb_height = (s->height + 15) / 16;
584
if(s->avctx->pix_fmt == PIX_FMT_NONE){
585
av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n");
589
if((s->encoding || (s->avctx->active_thread_type & FF_THREAD_SLICE)) &&
590
(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height))){
591
av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
595
if((s->width || s->height) && av_image_check_size(s->width, s->height, 0, s->avctx))
598
dsputil_init(&s->dsp, s->avctx);
599
ff_dct_common_init(s);
601
s->flags= s->avctx->flags;
602
s->flags2= s->avctx->flags2;
604
if (s->width && s->height) {
605
s->mb_width = (s->width + 15) / 16;
606
s->mb_stride = s->mb_width + 1;
607
s->b8_stride = s->mb_width*2 + 1;
608
s->b4_stride = s->mb_width*4 + 1;
609
mb_array_size= s->mb_height * s->mb_stride;
610
mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
612
/* set chroma shifts */
613
avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
614
&(s->chroma_y_shift) );
616
/* set default edge pos, will be overriden in decode_header if needed */
617
s->h_edge_pos= s->mb_width*16;
618
s->v_edge_pos= s->mb_height*16;
620
s->mb_num = s->mb_width * s->mb_height;
625
s->block_wrap[3]= s->b8_stride;
627
s->block_wrap[5]= s->mb_stride;
629
y_size = s->b8_stride * (2 * s->mb_height + 1);
630
c_size = s->mb_stride * (s->mb_height + 1);
631
yc_size = y_size + 2 * c_size;
633
/* convert fourcc to upper case */
634
s->codec_tag = ff_toupper4(s->avctx->codec_tag);
636
s->stream_codec_tag = ff_toupper4(s->avctx->stream_codec_tag);
638
s->avctx->coded_frame= (AVFrame*)&s->current_picture;
640
FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
641
for(y=0; y<s->mb_height; y++){
642
for(x=0; x<s->mb_width; x++){
643
s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
646
s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
649
/* Allocate MV tables */
650
FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
651
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
652
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
653
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
654
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
655
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
656
s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
657
s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
658
s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
659
s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
660
s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
661
s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
663
if(s->msmpeg4_version){
664
FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
666
FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
668
/* Allocate MB type table */
669
FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
671
FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
673
FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix , 64*32 * sizeof(int), fail)
674
FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix , 64*32 * sizeof(int), fail)
675
FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
676
FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
677
FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
678
FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
680
if(s->avctx->noise_reduction){
681
FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
686
s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
687
FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, s->picture_count * sizeof(Picture), fail)
688
for(i = 0; i < s->picture_count; i++) {
689
avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
692
if (s->width && s->height) {
693
FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
695
if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
696
/* interlaced direct mode decoding tables */
701
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
702
s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
704
FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
705
FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
706
s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
708
FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
711
if (s->out_format == FMT_H263) {
713
FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
714
s->coded_block= s->coded_block_base + s->b8_stride + 1;
716
/* cbp, ac_pred, pred_dir */
717
FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail)
718
FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
721
if (s->h263_pred || s->h263_plus || !s->encoding) {
723
//MN: we need these for error resilience of intra-frames
724
FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
725
s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
726
s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
727
s->dc_val[2] = s->dc_val[1] + c_size;
728
for(i=0;i<yc_size;i++)
729
s->dc_val_base[i] = 1024;
732
/* which mb is a intra block */
733
FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
734
memset(s->mbintra_table, 1, mb_array_size);
736
/* init macroblock skip table */
737
FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
738
//Note the +1 is for a quicker mpeg4 slice_end detection
739
FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
741
s->parse_context.state= -1;
742
if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
743
s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
744
s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
745
s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
749
s->context_initialized = 1;
750
s->thread_context[0]= s;
752
if (s->width && s->height) {
753
if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
754
threads = s->avctx->thread_count;
756
for(i=1; i<threads; i++){
757
s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
758
memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
761
for(i=0; i<threads; i++){
762
if(init_duplicate_context(s->thread_context[i], s) < 0)
764
s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
765
s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
768
if(init_duplicate_context(s, s) < 0) goto fail;
770
s->end_mb_y = s->mb_height;
780
/* init common structure for both encoder and decoder */
781
void MPV_common_end(MpegEncContext *s)
785
if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
786
for(i=0; i<s->avctx->thread_count; i++){
787
free_duplicate_context(s->thread_context[i]);
789
for(i=1; i<s->avctx->thread_count; i++){
790
av_freep(&s->thread_context[i]);
792
} else free_duplicate_context(s);
794
av_freep(&s->parse_context.buffer);
795
s->parse_context.buffer_size=0;
797
av_freep(&s->mb_type);
798
av_freep(&s->p_mv_table_base);
799
av_freep(&s->b_forw_mv_table_base);
800
av_freep(&s->b_back_mv_table_base);
801
av_freep(&s->b_bidir_forw_mv_table_base);
802
av_freep(&s->b_bidir_back_mv_table_base);
803
av_freep(&s->b_direct_mv_table_base);
805
s->b_forw_mv_table= NULL;
806
s->b_back_mv_table= NULL;
807
s->b_bidir_forw_mv_table= NULL;
808
s->b_bidir_back_mv_table= NULL;
809
s->b_direct_mv_table= NULL;
813
av_freep(&s->b_field_mv_table_base[i][j][k]);
814
s->b_field_mv_table[i][j][k]=NULL;
816
av_freep(&s->b_field_select_table[i][j]);
817
av_freep(&s->p_field_mv_table_base[i][j]);
818
s->p_field_mv_table[i][j]=NULL;
820
av_freep(&s->p_field_select_table[i]);
823
av_freep(&s->dc_val_base);
824
av_freep(&s->coded_block_base);
825
av_freep(&s->mbintra_table);
826
av_freep(&s->cbp_table);
827
av_freep(&s->pred_dir_table);
829
av_freep(&s->mbskip_table);
830
av_freep(&s->prev_pict_types);
831
av_freep(&s->bitstream_buffer);
832
s->allocated_bitstream_buffer_size=0;
834
av_freep(&s->avctx->stats_out);
835
av_freep(&s->ac_stats);
836
av_freep(&s->error_status_table);
837
av_freep(&s->mb_index2xy);
838
av_freep(&s->lambda_table);
839
av_freep(&s->q_intra_matrix);
840
av_freep(&s->q_inter_matrix);
841
av_freep(&s->q_intra_matrix16);
842
av_freep(&s->q_inter_matrix16);
843
av_freep(&s->input_picture);
844
av_freep(&s->reordered_input_picture);
845
av_freep(&s->dct_offset);
847
if(s->picture && !s->avctx->is_copy){
848
for(i=0; i<s->picture_count; i++){
849
free_picture(s, &s->picture[i]);
852
av_freep(&s->picture);
853
s->context_initialized = 0;
856
s->current_picture_ptr= NULL;
857
s->linesize= s->uvlinesize= 0;
860
av_freep(&s->visualization_buffer[i]);
862
if(!(s->avctx->active_thread_type&FF_THREAD_FRAME))
863
avcodec_default_free_buffers(s->avctx);
866
void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
868
int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
869
uint8_t index_run[MAX_RUN+1];
870
int last, run, level, start, end, i;
872
/* If table is static, we can quit if rl->max_level[0] is not NULL */
873
if(static_store && rl->max_level[0])
876
/* compute max_level[], max_run[] and index_run[] */
877
for(last=0;last<2;last++) {
886
memset(max_level, 0, MAX_RUN + 1);
887
memset(max_run, 0, MAX_LEVEL + 1);
888
memset(index_run, rl->n, MAX_RUN + 1);
889
for(i=start;i<end;i++) {
890
run = rl->table_run[i];
891
level = rl->table_level[i];
892
if (index_run[run] == rl->n)
894
if (level > max_level[run])
895
max_level[run] = level;
896
if (run > max_run[level])
897
max_run[level] = run;
900
rl->max_level[last] = static_store[last];
902
rl->max_level[last] = av_malloc(MAX_RUN + 1);
903
memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
905
rl->max_run[last] = static_store[last] + MAX_RUN + 1;
907
rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
908
memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
910
rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
912
rl->index_run[last] = av_malloc(MAX_RUN + 1);
913
memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
917
void init_vlc_rl(RLTable *rl)
929
for(i=0; i<rl->vlc.table_size; i++){
930
int code= rl->vlc.table[i][0];
931
int len = rl->vlc.table[i][1];
934
if(len==0){ // illegal code
937
}else if(len<0){ //more bits needed
941
if(code==rl->n){ //esc
945
run= rl->table_run [code] + 1;
946
level= rl->table_level[code] * qmul + qadd;
947
if(code >= rl->last) run+=192;
950
rl->rl_vlc[q][i].len= len;
951
rl->rl_vlc[q][i].level= level;
952
rl->rl_vlc[q][i].run= run;
957
void ff_release_unused_pictures(MpegEncContext *s, int remove_current)
961
/* release non reference frames */
962
for(i=0; i<s->picture_count; i++){
963
if(s->picture[i].data[0] && !s->picture[i].reference
964
&& (!s->picture[i].owner2 || s->picture[i].owner2 == s)
965
&& (remove_current || &s->picture[i] != s->current_picture_ptr)
966
/*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
967
free_frame_buffer(s, &s->picture[i]);
972
int ff_find_unused_picture(MpegEncContext *s, int shared){
976
for(i=s->picture_range_start; i<s->picture_range_end; i++){
977
if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
980
for(i=s->picture_range_start; i<s->picture_range_end; i++){
981
if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
983
for(i=s->picture_range_start; i<s->picture_range_end; i++){
984
if(s->picture[i].data[0]==NULL) return i;
988
av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
989
/* We could return -1, but the codec would crash trying to draw into a
990
* non-existing frame anyway. This is safer than waiting for a random crash.
991
* Also the return of this is never useful, an encoder must only allocate
992
* as much as allowed in the specification. This has no relationship to how
993
* much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
994
* enough for such valid streams).
995
* Plus, a decoder has to check stream validity and remove frames if too
996
* many reference frames are around. Waiting for "OOM" is not correct at
997
* all. Similarly, missing reference frames have to be replaced by
998
* interpolated/MC frames, anything else is a bug in the codec ...
1004
static void update_noise_reduction(MpegEncContext *s){
1007
for(intra=0; intra<2; intra++){
1008
if(s->dct_count[intra] > (1<<16)){
1009
for(i=0; i<64; i++){
1010
s->dct_error_sum[intra][i] >>=1;
1012
s->dct_count[intra] >>= 1;
1015
for(i=0; i<64; i++){
1016
s->dct_offset[intra][i]= (s->avctx->noise_reduction * s->dct_count[intra] + s->dct_error_sum[intra][i]/2) / (s->dct_error_sum[intra][i]+1);
1022
* generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1024
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1030
assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1032
/* mark&release old frames */
1033
if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1034
if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1035
free_frame_buffer(s, s->last_picture_ptr);
1037
/* release forgotten pictures */
1038
/* if(mpeg124/h263) */
1040
for(i=0; i<s->picture_count; i++){
1041
if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1042
av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1043
free_frame_buffer(s, &s->picture[i]);
1051
ff_release_unused_pictures(s, 1);
1053
if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1054
pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
1056
i= ff_find_unused_picture(s, 0);
1057
pic= &s->picture[i];
1062
if (s->codec_id == CODEC_ID_H264)
1063
pic->reference = s->picture_structure;
1064
else if (s->pict_type != AV_PICTURE_TYPE_B)
1068
pic->coded_picture_number= s->coded_picture_number++;
1070
if(ff_alloc_picture(s, pic, 0) < 0)
1073
s->current_picture_ptr= pic;
1074
//FIXME use only the vars from current_pic
1075
s->current_picture_ptr->top_field_first= s->top_field_first;
1076
if(s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) {
1077
if(s->picture_structure != PICT_FRAME)
1078
s->current_picture_ptr->top_field_first= (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1080
s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1081
s->current_picture_ptr->field_picture= s->picture_structure != PICT_FRAME;
1084
s->current_picture_ptr->pict_type= s->pict_type;
1085
// if(s->flags && CODEC_FLAG_QSCALE)
1086
// s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1087
s->current_picture_ptr->key_frame= s->pict_type == AV_PICTURE_TYPE_I;
1089
ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1091
if (s->pict_type != AV_PICTURE_TYPE_B) {
1092
s->last_picture_ptr= s->next_picture_ptr;
1094
s->next_picture_ptr= s->current_picture_ptr;
1096
/* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1097
s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1098
s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1099
s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1100
s->pict_type, s->dropable);*/
1102
if(s->codec_id != CODEC_ID_H264){
1103
if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) &&
1104
(s->pict_type!=AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)){
1105
if (s->pict_type != AV_PICTURE_TYPE_I)
1106
av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1107
else if (s->picture_structure != PICT_FRAME)
1108
av_log(avctx, AV_LOG_INFO, "allocate dummy last picture for field based first keyframe\n");
1110
/* Allocate a dummy frame */
1111
i= ff_find_unused_picture(s, 0);
1112
s->last_picture_ptr= &s->picture[i];
1113
if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
1115
ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0);
1116
ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 1);
1118
if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==AV_PICTURE_TYPE_B){
1119
/* Allocate a dummy frame */
1120
i= ff_find_unused_picture(s, 0);
1121
s->next_picture_ptr= &s->picture[i];
1122
if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
1124
ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 0);
1125
ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 1);
1129
if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1130
if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1132
assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1134
if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
1137
if(s->picture_structure == PICT_BOTTOM_FIELD){
1138
s->current_picture.data[i] += s->current_picture.linesize[i];
1140
s->current_picture.linesize[i] *= 2;
1141
s->last_picture.linesize[i] *=2;
1142
s->next_picture.linesize[i] *=2;
1146
s->error_recognition= avctx->error_recognition;
1148
/* set dequantizer, we can't do it during init as it might change for mpeg4
1149
and we can't do it in the header decode as init is not called for mpeg4 there yet */
1150
if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1151
s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1152
s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1153
}else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1154
s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1155
s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1157
s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1158
s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1161
if(s->dct_error_sum){
1162
assert(s->avctx->noise_reduction && s->encoding);
1164
update_noise_reduction(s);
1167
if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1168
return ff_xvmc_field_start(s, avctx);
1173
/* generic function for encode/decode called after a frame has been coded/decoded */
1174
void MPV_frame_end(MpegEncContext *s)
1177
/* redraw edges for the frame if decoding didn't complete */
1178
//just to make sure that all data is rendered.
1179
if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1180
ff_xvmc_field_end(s);
1181
}else if((s->error_count || s->encoding)
1182
&& !s->avctx->hwaccel
1183
&& !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1184
&& s->unrestricted_mv
1185
&& s->current_picture.reference
1187
&& !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1188
int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
1189
int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
1190
s->dsp.draw_edges(s->current_picture.data[0], s->linesize ,
1191
s->h_edge_pos , s->v_edge_pos,
1192
EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
1193
s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize,
1194
s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
1195
EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
1196
s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize,
1197
s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
1198
EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
1203
s->last_pict_type = s->pict_type;
1204
s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1205
if(s->pict_type!=AV_PICTURE_TYPE_B){
1206
s->last_non_b_pict_type= s->pict_type;
1209
/* copy back current_picture variables */
1210
for(i=0; i<MAX_PICTURE_COUNT; i++){
1211
if(s->picture[i].data[0] == s->current_picture.data[0]){
1212
s->picture[i]= s->current_picture;
1216
assert(i<MAX_PICTURE_COUNT);
1220
/* release non-reference frames */
1221
for(i=0; i<s->picture_count; i++){
1222
if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1223
free_frame_buffer(s, &s->picture[i]);
1227
// clear copies, to avoid confusion
1229
memset(&s->last_picture, 0, sizeof(Picture));
1230
memset(&s->next_picture, 0, sizeof(Picture));
1231
memset(&s->current_picture, 0, sizeof(Picture));
1233
s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1235
if (s->codec_id != CODEC_ID_H264 && s->current_picture.reference) {
1236
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_height-1, 0);
1241
* draws an line from (ex, ey) -> (sx, sy).
1242
* @param w width of the image
1243
* @param h height of the image
1244
* @param stride stride/linesize of the image
1245
* @param color color of the arrow
1247
static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1250
sx= av_clip(sx, 0, w-1);
1251
sy= av_clip(sy, 0, h-1);
1252
ex= av_clip(ex, 0, w-1);
1253
ey= av_clip(ey, 0, h-1);
1255
buf[sy*stride + sx]+= color;
1257
if(FFABS(ex - sx) > FFABS(ey - sy)){
1259
FFSWAP(int, sx, ex);
1260
FFSWAP(int, sy, ey);
1262
buf+= sx + sy*stride;
1264
f= ((ey-sy)<<16)/ex;
1265
for(x= 0; x <= ex; x++){
1268
buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1269
buf[(y+1)*stride + x]+= (color* fr )>>16;
1273
FFSWAP(int, sx, ex);
1274
FFSWAP(int, sy, ey);
1276
buf+= sx + sy*stride;
1278
if(ey) f= ((ex-sx)<<16)/ey;
1280
for(y= 0; y <= ey; y++){
1283
buf[y*stride + x ]+= (color*(0x10000-fr))>>16;
1284
buf[y*stride + x+1]+= (color* fr )>>16;
1290
* draws an arrow from (ex, ey) -> (sx, sy).
1291
* @param w width of the image
1292
* @param h height of the image
1293
* @param stride stride/linesize of the image
1294
* @param color color of the arrow
1296
static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1299
sx= av_clip(sx, -100, w+100);
1300
sy= av_clip(sy, -100, h+100);
1301
ex= av_clip(ex, -100, w+100);
1302
ey= av_clip(ey, -100, h+100);
1307
if(dx*dx + dy*dy > 3*3){
1310
int length= ff_sqrt((rx*rx + ry*ry)<<8);
1312
//FIXME subpixel accuracy
1313
rx= ROUNDED_DIV(rx*3<<4, length);
1314
ry= ROUNDED_DIV(ry*3<<4, length);
1316
draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1317
draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1319
draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1323
* prints debuging info for the given picture.
1325
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1327
if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1329
if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1332
av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1333
switch (pict->pict_type) {
1334
case AV_PICTURE_TYPE_I: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1335
case AV_PICTURE_TYPE_P: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1336
case AV_PICTURE_TYPE_B: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1337
case AV_PICTURE_TYPE_S: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1338
case AV_PICTURE_TYPE_SI: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1339
case AV_PICTURE_TYPE_SP: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1341
for(y=0; y<s->mb_height; y++){
1342
for(x=0; x<s->mb_width; x++){
1343
if(s->avctx->debug&FF_DEBUG_SKIP){
1344
int count= s->mbskip_table[x + y*s->mb_stride];
1345
if(count>9) count=9;
1346
av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1348
if(s->avctx->debug&FF_DEBUG_QP){
1349
av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1351
if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1352
int mb_type= pict->mb_type[x + y*s->mb_stride];
1353
//Type & MV direction
1355
av_log(s->avctx, AV_LOG_DEBUG, "P");
1356
else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1357
av_log(s->avctx, AV_LOG_DEBUG, "A");
1358
else if(IS_INTRA4x4(mb_type))
1359
av_log(s->avctx, AV_LOG_DEBUG, "i");
1360
else if(IS_INTRA16x16(mb_type))
1361
av_log(s->avctx, AV_LOG_DEBUG, "I");
1362
else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1363
av_log(s->avctx, AV_LOG_DEBUG, "d");
1364
else if(IS_DIRECT(mb_type))
1365
av_log(s->avctx, AV_LOG_DEBUG, "D");
1366
else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1367
av_log(s->avctx, AV_LOG_DEBUG, "g");
1368
else if(IS_GMC(mb_type))
1369
av_log(s->avctx, AV_LOG_DEBUG, "G");
1370
else if(IS_SKIP(mb_type))
1371
av_log(s->avctx, AV_LOG_DEBUG, "S");
1372
else if(!USES_LIST(mb_type, 1))
1373
av_log(s->avctx, AV_LOG_DEBUG, ">");
1374
else if(!USES_LIST(mb_type, 0))
1375
av_log(s->avctx, AV_LOG_DEBUG, "<");
1377
assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1378
av_log(s->avctx, AV_LOG_DEBUG, "X");
1383
av_log(s->avctx, AV_LOG_DEBUG, "+");
1384
else if(IS_16X8(mb_type))
1385
av_log(s->avctx, AV_LOG_DEBUG, "-");
1386
else if(IS_8X16(mb_type))
1387
av_log(s->avctx, AV_LOG_DEBUG, "|");
1388
else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1389
av_log(s->avctx, AV_LOG_DEBUG, " ");
1391
av_log(s->avctx, AV_LOG_DEBUG, "?");
1394
if(IS_INTERLACED(mb_type))
1395
av_log(s->avctx, AV_LOG_DEBUG, "=");
1397
av_log(s->avctx, AV_LOG_DEBUG, " ");
1399
// av_log(s->avctx, AV_LOG_DEBUG, " ");
1401
av_log(s->avctx, AV_LOG_DEBUG, "\n");
1405
if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1406
const int shift= 1 + s->quarter_sample;
1410
int h_chroma_shift, v_chroma_shift, block_height;
1411
const int width = s->avctx->width;
1412
const int height= s->avctx->height;
1413
const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1414
const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1415
s->low_delay=0; //needed to see the vectors without trashing the buffers
1417
avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1419
memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1420
pict->data[i]= s->visualization_buffer[i];
1422
pict->type= FF_BUFFER_TYPE_COPY;
1424
block_height = 16>>v_chroma_shift;
1426
for(mb_y=0; mb_y<s->mb_height; mb_y++){
1428
for(mb_x=0; mb_x<s->mb_width; mb_x++){
1429
const int mb_index= mb_x + mb_y*s->mb_stride;
1430
if((s->avctx->debug_mv) && pict->motion_val){
1432
for(type=0; type<3; type++){
1435
case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_P))
1439
case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1443
case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1448
if(!USES_LIST(pict->mb_type[mb_index], direction))
1451
if(IS_8X8(pict->mb_type[mb_index])){
1454
int sx= mb_x*16 + 4 + 8*(i&1);
1455
int sy= mb_y*16 + 4 + 8*(i>>1);
1456
int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1457
int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1458
int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1459
draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1461
}else if(IS_16X8(pict->mb_type[mb_index])){
1465
int sy=mb_y*16 + 4 + 8*i;
1466
int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1467
int mx=(pict->motion_val[direction][xy][0]>>shift);
1468
int my=(pict->motion_val[direction][xy][1]>>shift);
1470
if(IS_INTERLACED(pict->mb_type[mb_index]))
1473
draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1475
}else if(IS_8X16(pict->mb_type[mb_index])){
1478
int sx=mb_x*16 + 4 + 8*i;
1480
int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1481
int mx=(pict->motion_val[direction][xy][0]>>shift);
1482
int my=(pict->motion_val[direction][xy][1]>>shift);
1484
if(IS_INTERLACED(pict->mb_type[mb_index]))
1487
draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1490
int sx= mb_x*16 + 8;
1491
int sy= mb_y*16 + 8;
1492
int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1493
int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1494
int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1495
draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1499
if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1500
uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1502
for(y=0; y<block_height; y++){
1503
*(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
1504
*(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
1507
if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1508
int mb_type= pict->mb_type[mb_index];
1511
#define COLOR(theta, r)\
1512
u= (int)(128 + r*cos(theta*3.141592/180));\
1513
v= (int)(128 + r*sin(theta*3.141592/180));
1517
if(IS_PCM(mb_type)){
1519
}else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1521
}else if(IS_INTRA4x4(mb_type)){
1523
}else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1525
}else if(IS_DIRECT(mb_type)){
1527
}else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1529
}else if(IS_GMC(mb_type)){
1531
}else if(IS_SKIP(mb_type)){
1533
}else if(!USES_LIST(mb_type, 1)){
1535
}else if(!USES_LIST(mb_type, 0)){
1538
assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1542
u*= 0x0101010101010101ULL;
1543
v*= 0x0101010101010101ULL;
1544
for(y=0; y<block_height; y++){
1545
*(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
1546
*(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
1550
if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1551
*(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1552
*(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1554
if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1556
pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1558
if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1559
int dm= 1 << (mv_sample_log2-2);
1561
int sx= mb_x*16 + 8*(i&1);
1562
int sy= mb_y*16 + 8*(i>>1);
1563
int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1565
int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1566
if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1568
pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1569
if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1570
*(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1574
if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1578
s->mbskip_table[mb_index]=0;
1584
static inline int hpel_motion_lowres(MpegEncContext *s,
1585
uint8_t *dest, uint8_t *src,
1586
int field_based, int field_select,
1587
int src_x, int src_y,
1588
int width, int height, int stride,
1589
int h_edge_pos, int v_edge_pos,
1590
int w, int h, h264_chroma_mc_func *pix_op,
1591
int motion_x, int motion_y)
1593
const int lowres= s->avctx->lowres;
1594
const int op_index= FFMIN(lowres, 2);
1595
const int s_mask= (2<<lowres)-1;
1599
if(s->quarter_sample){
1604
sx= motion_x & s_mask;
1605
sy= motion_y & s_mask;
1606
src_x += motion_x >> (lowres+1);
1607
src_y += motion_y >> (lowres+1);
1609
src += src_y * stride + src_x;
1611
if( (unsigned)src_x > h_edge_pos - (!!sx) - w
1612
|| (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1613
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
1614
src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1615
src= s->edge_emu_buffer;
1619
sx= (sx << 2) >> lowres;
1620
sy= (sy << 2) >> lowres;
1623
pix_op[op_index](dest, src, stride, h, sx, sy);
1627
/* apply one mpeg motion vector to the three components */
1628
static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1629
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1630
int field_based, int bottom_field, int field_select,
1631
uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1632
int motion_x, int motion_y, int h, int mb_y)
1634
uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1635
int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
1636
const int lowres= s->avctx->lowres;
1637
const int op_index= FFMIN(lowres, 2);
1638
const int block_s= 8>>lowres;
1639
const int s_mask= (2<<lowres)-1;
1640
const int h_edge_pos = s->h_edge_pos >> lowres;
1641
const int v_edge_pos = s->v_edge_pos >> lowres;
1642
linesize = s->current_picture.linesize[0] << field_based;
1643
uvlinesize = s->current_picture.linesize[1] << field_based;
1645
if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
1651
motion_y += (bottom_field - field_select)*((1<<lowres)-1);
1654
sx= motion_x & s_mask;
1655
sy= motion_y & s_mask;
1656
src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
1657
src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1659
if (s->out_format == FMT_H263) {
1660
uvsx = ((motion_x>>1) & s_mask) | (sx&1);
1661
uvsy = ((motion_y>>1) & s_mask) | (sy&1);
1664
}else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
1667
uvsx = (2*mx) & s_mask;
1668
uvsy = (2*my) & s_mask;
1669
uvsrc_x = s->mb_x*block_s + (mx >> lowres);
1670
uvsrc_y = mb_y*block_s + (my >> lowres);
1676
uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1677
uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1));
1680
ptr_y = ref_picture[0] + src_y * linesize + src_x;
1681
ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1682
ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1684
if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
1685
|| (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1686
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
1687
src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1688
ptr_y = s->edge_emu_buffer;
1689
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1690
uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1691
s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
1692
uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1693
s->dsp.emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
1694
uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1700
if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
1701
dest_y += s->linesize;
1702
dest_cb+= s->uvlinesize;
1703
dest_cr+= s->uvlinesize;
1707
ptr_y += s->linesize;
1708
ptr_cb+= s->uvlinesize;
1709
ptr_cr+= s->uvlinesize;
1712
sx= (sx << 2) >> lowres;
1713
sy= (sy << 2) >> lowres;
1714
pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1716
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1717
uvsx= (uvsx << 2) >> lowres;
1718
uvsy= (uvsy << 2) >> lowres;
1719
pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1720
pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1722
//FIXME h261 lowres loop filter
1725
static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1726
uint8_t *dest_cb, uint8_t *dest_cr,
1727
uint8_t **ref_picture,
1728
h264_chroma_mc_func *pix_op,
1730
const int lowres= s->avctx->lowres;
1731
const int op_index= FFMIN(lowres, 2);
1732
const int block_s= 8>>lowres;
1733
const int s_mask= (2<<lowres)-1;
1734
const int h_edge_pos = s->h_edge_pos >> (lowres+1);
1735
const int v_edge_pos = s->v_edge_pos >> (lowres+1);
1736
int emu=0, src_x, src_y, offset, sx, sy;
1739
if(s->quarter_sample){
1744
/* In case of 8X8, we construct a single chroma motion vector
1745
with a special rounding */
1746
mx= ff_h263_round_chroma(mx);
1747
my= ff_h263_round_chroma(my);
1751
src_x = s->mb_x*block_s + (mx >> (lowres+1));
1752
src_y = s->mb_y*block_s + (my >> (lowres+1));
1754
offset = src_y * s->uvlinesize + src_x;
1755
ptr = ref_picture[1] + offset;
1756
if(s->flags&CODEC_FLAG_EMU_EDGE){
1757
if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
1758
|| (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
1759
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1760
ptr= s->edge_emu_buffer;
1764
sx= (sx << 2) >> lowres;
1765
sy= (sy << 2) >> lowres;
1766
pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1768
ptr = ref_picture[2] + offset;
1770
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1771
ptr= s->edge_emu_buffer;
1773
pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
1777
* motion compensation of a single macroblock
1779
* @param dest_y luma destination pointer
1780
* @param dest_cb chroma cb/u destination pointer
1781
* @param dest_cr chroma cr/v destination pointer
1782
* @param dir direction (0->forward, 1->backward)
1783
* @param ref_picture array[3] of pointers to the 3 planes of the reference picture
1784
* @param pix_op halfpel motion compensation function (average or put normally)
1785
* the motion vectors are taken from s->mv and the MV type from s->mv_type
1787
static inline void MPV_motion_lowres(MpegEncContext *s,
1788
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1789
int dir, uint8_t **ref_picture,
1790
h264_chroma_mc_func *pix_op)
1794
const int lowres= s->avctx->lowres;
1795
const int block_s= 8>>lowres;
1800
switch(s->mv_type) {
1802
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1804
ref_picture, pix_op,
1805
s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
1811
hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1812
ref_picture[0], 0, 0,
1813
(2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
1814
s->width, s->height, s->linesize,
1815
s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
1816
block_s, block_s, pix_op,
1817
s->mv[dir][i][0], s->mv[dir][i][1]);
1819
mx += s->mv[dir][i][0];
1820
my += s->mv[dir][i][1];
1823
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
1824
chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
1827
if (s->picture_structure == PICT_FRAME) {
1829
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1830
1, 0, s->field_select[dir][0],
1831
ref_picture, pix_op,
1832
s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
1834
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1835
1, 1, s->field_select[dir][1],
1836
ref_picture, pix_op,
1837
s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
1839
if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){
1840
ref_picture= s->current_picture_ptr->data;
1843
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1844
0, 0, s->field_select[dir][0],
1845
ref_picture, pix_op,
1846
s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
1851
uint8_t ** ref2picture;
1853
if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == AV_PICTURE_TYPE_B || s->first_field){
1854
ref2picture= ref_picture;
1856
ref2picture= s->current_picture_ptr->data;
1859
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1860
0, 0, s->field_select[dir][i],
1861
ref2picture, pix_op,
1862
s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1864
dest_y += 2*block_s*s->linesize;
1865
dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1866
dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1870
if(s->picture_structure == PICT_FRAME){
1874
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1876
ref_picture, pix_op,
1877
s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
1879
pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1883
mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1884
0, 0, s->picture_structure != i+1,
1885
ref_picture, pix_op,
1886
s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1888
// after put we make avg of the same block
1889
pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1891
//opposite parity is always in the same frame if this is second field
1892
if(!s->first_field){
1893
ref_picture = s->current_picture_ptr->data;
1903
* find the lowest MB row referenced in the MVs
1905
int MPV_lowest_referenced_row(MpegEncContext *s, int dir)
1907
int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
1908
int my, off, i, mvs;
1910
if (s->picture_structure != PICT_FRAME) goto unhandled;
1912
switch (s->mv_type) {
1926
for (i = 0; i < mvs; i++) {
1927
my = s->mv[dir][i][1]<<qpel_shift;
1928
my_max = FFMAX(my_max, my);
1929
my_min = FFMIN(my_min, my);
1932
off = (FFMAX(-my_min, my_max) + 63) >> 6;
1934
return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
1936
return s->mb_height-1;
1939
/* put block[] to dest[] */
1940
static inline void put_dct(MpegEncContext *s,
1941
DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1943
s->dct_unquantize_intra(s, block, i, qscale);
1944
s->dsp.idct_put (dest, line_size, block);
1947
/* add block[] to dest[] */
1948
static inline void add_dct(MpegEncContext *s,
1949
DCTELEM *block, int i, uint8_t *dest, int line_size)
1951
if (s->block_last_index[i] >= 0) {
1952
s->dsp.idct_add (dest, line_size, block);
1956
static inline void add_dequant_dct(MpegEncContext *s,
1957
DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1959
if (s->block_last_index[i] >= 0) {
1960
s->dct_unquantize_inter(s, block, i, qscale);
1962
s->dsp.idct_add (dest, line_size, block);
1967
* cleans dc, ac, coded_block for the current non intra MB
1969
void ff_clean_intra_table_entries(MpegEncContext *s)
1971
int wrap = s->b8_stride;
1972
int xy = s->block_index[0];
1975
s->dc_val[0][xy + 1 ] =
1976
s->dc_val[0][xy + wrap] =
1977
s->dc_val[0][xy + 1 + wrap] = 1024;
1979
memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
1980
memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1981
if (s->msmpeg4_version>=3) {
1982
s->coded_block[xy ] =
1983
s->coded_block[xy + 1 ] =
1984
s->coded_block[xy + wrap] =
1985
s->coded_block[xy + 1 + wrap] = 0;
1988
wrap = s->mb_stride;
1989
xy = s->mb_x + s->mb_y * wrap;
1991
s->dc_val[2][xy] = 1024;
1993
memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
1994
memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1996
s->mbintra_table[xy]= 0;
1999
/* generic function called after a macroblock has been parsed by the
2000
decoder or after it has been encoded by the encoder.
2002
Important variables used:
2003
s->mb_intra : true if intra macroblock
2004
s->mv_dir : motion vector direction
2005
s->mv_type : motion vector type
2006
s->mv : motion vector
2007
s->interlaced_dct : true if interlaced dct used (mpeg2)
2009
static av_always_inline
2010
void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2011
int lowres_flag, int is_mpeg12)
2013
const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2014
if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2015
ff_xvmc_decode_mb(s);//xvmc uses pblocks
2019
if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2020
/* save DCT coefficients */
2022
DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
2023
av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2025
for(j=0; j<64; j++){
2026
*dct++ = block[i][s->dsp.idct_permutation[j]];
2027
av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2029
av_log(s->avctx, AV_LOG_DEBUG, "\n");
2033
s->current_picture.qscale_table[mb_xy]= s->qscale;
2035
/* update DC predictors for P macroblocks */
2037
if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2038
if(s->mbintra_table[mb_xy])
2039
ff_clean_intra_table_entries(s);
2043
s->last_dc[2] = 128 << s->intra_dc_precision;
2046
else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2047
s->mbintra_table[mb_xy]=1;
2049
if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==AV_PICTURE_TYPE_B) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
2050
uint8_t *dest_y, *dest_cb, *dest_cr;
2051
int dct_linesize, dct_offset;
2052
op_pixels_func (*op_pix)[4];
2053
qpel_mc_func (*op_qpix)[16];
2054
const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2055
const int uvlinesize= s->current_picture.linesize[1];
2056
const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2057
const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2059
/* avoid copy if macroblock skipped in last frame too */
2060
/* skip only during decoding as we might trash the buffers during encoding a bit */
2062
uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2063
const int age= s->current_picture.age;
2067
if (s->mb_skipped) {
2069
assert(s->pict_type!=AV_PICTURE_TYPE_I);
2071
(*mbskip_ptr) ++; /* indicate that this time we skipped it */
2072
if(*mbskip_ptr >99) *mbskip_ptr= 99;
2074
/* if previous was skipped too, then nothing to do ! */
2075
if (*mbskip_ptr >= age && s->current_picture.reference){
2078
} else if(!s->current_picture.reference){
2079
(*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2080
if(*mbskip_ptr >99) *mbskip_ptr= 99;
2082
*mbskip_ptr = 0; /* not skipped */
2086
dct_linesize = linesize << s->interlaced_dct;
2087
dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
2091
dest_cb= s->dest[1];
2092
dest_cr= s->dest[2];
2094
dest_y = s->b_scratchpad;
2095
dest_cb= s->b_scratchpad+16*linesize;
2096
dest_cr= s->b_scratchpad+32*linesize;
2100
/* motion handling */
2101
/* decoding or more than one mb_type (MC was already done otherwise) */
2104
if(HAVE_PTHREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2105
if (s->mv_dir & MV_DIR_FORWARD) {
2106
ff_thread_await_progress((AVFrame*)s->last_picture_ptr, MPV_lowest_referenced_row(s, 0), 0);
2108
if (s->mv_dir & MV_DIR_BACKWARD) {
2109
ff_thread_await_progress((AVFrame*)s->next_picture_ptr, MPV_lowest_referenced_row(s, 1), 0);
2114
h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2116
if (s->mv_dir & MV_DIR_FORWARD) {
2117
MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
2118
op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2120
if (s->mv_dir & MV_DIR_BACKWARD) {
2121
MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
2124
op_qpix= s->me.qpel_put;
2125
if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2126
op_pix = s->dsp.put_pixels_tab;
2128
op_pix = s->dsp.put_no_rnd_pixels_tab;
2130
if (s->mv_dir & MV_DIR_FORWARD) {
2131
MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2132
op_pix = s->dsp.avg_pixels_tab;
2133
op_qpix= s->me.qpel_avg;
2135
if (s->mv_dir & MV_DIR_BACKWARD) {
2136
MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2141
/* skip dequant / idct if we are really late ;) */
2142
if(s->avctx->skip_idct){
2143
if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2144
||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2145
|| s->avctx->skip_idct >= AVDISCARD_ALL)
2149
/* add dct residue */
2150
if(s->encoding || !( s->msmpeg4_version || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2151
|| (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2152
add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2153
add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2154
add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2155
add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2157
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2158
if (s->chroma_y_shift){
2159
add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2160
add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2164
add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2165
add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2166
add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2167
add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2170
} else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
2171
add_dct(s, block[0], 0, dest_y , dct_linesize);
2172
add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2173
add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2174
add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2176
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2177
if(s->chroma_y_shift){//Chroma420
2178
add_dct(s, block[4], 4, dest_cb, uvlinesize);
2179
add_dct(s, block[5], 5, dest_cr, uvlinesize);
2182
dct_linesize = uvlinesize << s->interlaced_dct;
2183
dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2185
add_dct(s, block[4], 4, dest_cb, dct_linesize);
2186
add_dct(s, block[5], 5, dest_cr, dct_linesize);
2187
add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2188
add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2189
if(!s->chroma_x_shift){//Chroma444
2190
add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
2191
add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
2192
add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
2193
add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
2198
else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2199
ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2202
/* dct only in intra block */
2203
if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2204
put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2205
put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2206
put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2207
put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2209
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2210
if(s->chroma_y_shift){
2211
put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2212
put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2216
put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2217
put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2218
put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2219
put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2223
s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2224
s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2225
s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2226
s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2228
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2229
if(s->chroma_y_shift){
2230
s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2231
s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2234
dct_linesize = uvlinesize << s->interlaced_dct;
2235
dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2237
s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2238
s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2239
s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2240
s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2241
if(!s->chroma_x_shift){//Chroma444
2242
s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2243
s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2244
s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2245
s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
2253
s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2254
s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2255
s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2260
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2262
if(s->out_format == FMT_MPEG1) {
2263
if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2264
else MPV_decode_mb_internal(s, block, 0, 1);
2267
if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2268
else MPV_decode_mb_internal(s, block, 0, 0);
2273
* @param h is the normal height, this will be reduced automatically if needed for the last row
2275
void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2276
const int field_pic= s->picture_structure != PICT_FRAME;
2282
if (!s->avctx->hwaccel
2283
&& !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2284
&& s->unrestricted_mv
2285
&& s->current_picture.reference
2287
&& !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2288
int sides = 0, edge_h;
2289
int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
2290
int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
2291
if (y==0) sides |= EDGE_TOP;
2292
if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2294
edge_h= FFMIN(h, s->v_edge_pos - y);
2296
s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize,
2297
s->h_edge_pos , edge_h , EDGE_WIDTH , EDGE_WIDTH , sides);
2298
s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
2299
s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2300
s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
2301
s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2304
h= FFMIN(h, s->avctx->height - y);
2306
if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2308
if (s->avctx->draw_horiz_band) {
2312
if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2313
src= (AVFrame*)s->current_picture_ptr;
2314
else if(s->last_picture_ptr)
2315
src= (AVFrame*)s->last_picture_ptr;
2319
if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2325
offset[0]= y * s->linesize;
2327
offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2333
s->avctx->draw_horiz_band(s->avctx, src, offset,
2334
y, s->picture_structure, h);
2338
void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2339
const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2340
const int uvlinesize= s->current_picture.linesize[1];
2341
const int mb_size= 4 - s->avctx->lowres;
2343
s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2344
s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2345
s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2346
s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2347
s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2348
s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2349
//block_index is not used by mpeg2, so it is not affected by chroma_format
2351
s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
2352
s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2353
s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2355
if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2357
if(s->picture_structure==PICT_FRAME){
2358
s->dest[0] += s->mb_y * linesize << mb_size;
2359
s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2360
s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2362
s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2363
s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2364
s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2365
assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2370
void ff_mpeg_flush(AVCodecContext *avctx){
2372
MpegEncContext *s = avctx->priv_data;
2374
if(s==NULL || s->picture==NULL)
2377
for(i=0; i<s->picture_count; i++){
2378
if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
2379
|| s->picture[i].type == FF_BUFFER_TYPE_USER))
2380
free_frame_buffer(s, &s->picture[i]);
2382
s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2384
s->mb_x= s->mb_y= 0;
2387
s->parse_context.state= -1;
2388
s->parse_context.frame_start_found= 0;
2389
s->parse_context.overread= 0;
2390
s->parse_context.overread_index= 0;
2391
s->parse_context.index= 0;
2392
s->parse_context.last_index= 0;
2393
s->bitstream_buffer_size=0;
2397
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2398
DCTELEM *block, int n, int qscale)
2400
int i, level, nCoeffs;
2401
const uint16_t *quant_matrix;
2403
nCoeffs= s->block_last_index[n];
2406
block[0] = block[0] * s->y_dc_scale;
2408
block[0] = block[0] * s->c_dc_scale;
2409
/* XXX: only mpeg1 */
2410
quant_matrix = s->intra_matrix;
2411
for(i=1;i<=nCoeffs;i++) {
2412
int j= s->intra_scantable.permutated[i];
2417
level = (int)(level * qscale * quant_matrix[j]) >> 3;
2418
level = (level - 1) | 1;
2421
level = (int)(level * qscale * quant_matrix[j]) >> 3;
2422
level = (level - 1) | 1;
2429
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2430
DCTELEM *block, int n, int qscale)
2432
int i, level, nCoeffs;
2433
const uint16_t *quant_matrix;
2435
nCoeffs= s->block_last_index[n];
2437
quant_matrix = s->inter_matrix;
2438
for(i=0; i<=nCoeffs; i++) {
2439
int j= s->intra_scantable.permutated[i];
2444
level = (((level << 1) + 1) * qscale *
2445
((int) (quant_matrix[j]))) >> 4;
2446
level = (level - 1) | 1;
2449
level = (((level << 1) + 1) * qscale *
2450
((int) (quant_matrix[j]))) >> 4;
2451
level = (level - 1) | 1;
2458
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2459
DCTELEM *block, int n, int qscale)
2461
int i, level, nCoeffs;
2462
const uint16_t *quant_matrix;
2464
if(s->alternate_scan) nCoeffs= 63;
2465
else nCoeffs= s->block_last_index[n];
2468
block[0] = block[0] * s->y_dc_scale;
2470
block[0] = block[0] * s->c_dc_scale;
2471
quant_matrix = s->intra_matrix;
2472
for(i=1;i<=nCoeffs;i++) {
2473
int j= s->intra_scantable.permutated[i];
2478
level = (int)(level * qscale * quant_matrix[j]) >> 3;
2481
level = (int)(level * qscale * quant_matrix[j]) >> 3;
2488
static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2489
DCTELEM *block, int n, int qscale)
2491
int i, level, nCoeffs;
2492
const uint16_t *quant_matrix;
2495
if(s->alternate_scan) nCoeffs= 63;
2496
else nCoeffs= s->block_last_index[n];
2499
block[0] = block[0] * s->y_dc_scale;
2501
block[0] = block[0] * s->c_dc_scale;
2502
quant_matrix = s->intra_matrix;
2503
for(i=1;i<=nCoeffs;i++) {
2504
int j= s->intra_scantable.permutated[i];
2509
level = (int)(level * qscale * quant_matrix[j]) >> 3;
2512
level = (int)(level * qscale * quant_matrix[j]) >> 3;
2521
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2522
DCTELEM *block, int n, int qscale)
2524
int i, level, nCoeffs;
2525
const uint16_t *quant_matrix;
2528
if(s->alternate_scan) nCoeffs= 63;
2529
else nCoeffs= s->block_last_index[n];
2531
quant_matrix = s->inter_matrix;
2532
for(i=0; i<=nCoeffs; i++) {
2533
int j= s->intra_scantable.permutated[i];
2538
level = (((level << 1) + 1) * qscale *
2539
((int) (quant_matrix[j]))) >> 4;
2542
level = (((level << 1) + 1) * qscale *
2543
((int) (quant_matrix[j]))) >> 4;
2552
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2553
DCTELEM *block, int n, int qscale)
2555
int i, level, qmul, qadd;
2558
assert(s->block_last_index[n]>=0);
2564
block[0] = block[0] * s->y_dc_scale;
2566
block[0] = block[0] * s->c_dc_scale;
2567
qadd = (qscale - 1) | 1;
2574
nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2576
for(i=1; i<=nCoeffs; i++) {
2580
level = level * qmul - qadd;
2582
level = level * qmul + qadd;
2589
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2590
DCTELEM *block, int n, int qscale)
2592
int i, level, qmul, qadd;
2595
assert(s->block_last_index[n]>=0);
2597
qadd = (qscale - 1) | 1;
2600
nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2602
for(i=0; i<=nCoeffs; i++) {
2606
level = level * qmul - qadd;
2608
level = level * qmul + qadd;
2616
* set qscale and update qscale dependent variables.
2618
void ff_set_qscale(MpegEncContext * s, int qscale)
2622
else if (qscale > 31)
2626
s->chroma_qscale= s->chroma_qscale_table[qscale];
2628
s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2629
s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2632
void MPV_report_decode_progress(MpegEncContext *s)
2634
if (s->pict_type != FF_B_TYPE && !s->partitioned_frame && !s->error_occurred)
2635
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0);