diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-03-12 03:20:18 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-03-12 03:23:28 +0100 |
commit | 80e9e63c946660304fc65fa8141ccfdbe4d196d1 (patch) | |
tree | 55eb37a0bd8d102b07516b88015094d8f3bc6216 /libavcodec/mpegvideo_enc.c | |
parent | 2e7bc9c2a1f138d305f111bb07d8b70e494584a8 (diff) | |
parent | 759001c534287a96dc96d1e274665feb7059145d (diff) | |
download | ffmpeg-80e9e63c946660304fc65fa8141ccfdbe4d196d1.tar.gz |
Merge commit '759001c534287a96dc96d1e274665feb7059145d'
* commit '759001c534287a96dc96d1e274665feb7059145d':
lavc decoders: work with refcounted frames.
Anton Khirnov (1):
lavc decoders: work with refcounted frames.
Clément Bœsch (47):
lavc/ansi: reset file
lavc/ansi: re-do refcounted frame changes from Anton
fraps: reset file
lavc/fraps: switch to refcounted frames
gifdec: reset file
lavc/gifdec: switch to refcounted frames
dsicinav: resolve conflicts
smc: resolve conflicts
zmbv: resolve conflicts
rpza: resolve conflicts
vble: resolve conflicts
xxan: resolve conflicts
targa: resolve conflicts
vmnc: resolve conflicts
utvideodec: resolve conflicts
tscc: resolve conflicts
ulti: resolve conflicts
ffv1dec: resolve conflicts
dnxhddec: resolve conflicts
v210dec: resolve conflicts
vp3: resolve conflicts
vcr1: resolve conflicts
v210x: resolve conflicts
wavpack: resolve conflicts
pngdec: fix compilation
roqvideodec: resolve conflicts
pictordec: resolve conflicts
mdec: resolve conflicts
tiertexseqv: resolve conflicts
smacker: resolve conflicts
vb: resolve conflicts
vqavideo: resolve conflicts
xl: resolve conflicts
tmv: resolve conflicts
vmdav: resolve conflicts
truemotion1: resolve conflicts
truemotion2: resolve conflicts
lcldec: fix compilation
libcelt_dec: fix compilation
qdrw: fix compilation
r210dec: fix compilation
rl2: fix compilation
wnv1: fix compilation
yop: fix compilation
tiff: resolve conflicts
interplayvideo: fix compilation
qpeg: resolve conflicts (FIXME/TESTME).
Hendrik Leppkes (33):
012v: convert to refcounted frames
8bps: fix compilation
8svx: resolve conflicts
4xm: resolve conflicts
aasc: resolve conflicts
bfi: fix compilation
aura: fix compilation
alsdec: resolve conflicts
avrndec: convert to refcounted frames
avuidec: convert to refcounted frames
bintext: convert to refcounted frames
cavsdec: resolve conflicts
brender_pix: convert to refcounted frames
cinepak: resolve conflicts
cinepak: avoid using AVFrame struct directly in private context
cljr: fix compilation
cpia: convert to refcounted frames
cscd: resolve conflicts
iff: resolve conflicts and do proper conversion to refcounted frames
4xm: fix reference frame handling
cyuv: fix compilation
dxa: fix compilation
eacmv: fix compilation
eamad: fix compilation
eatgv: fix compilation
escape124: remove unused variable.
escape130: convert to refcounted frames
evrcdec: convert to refcounted frames
exr: convert to refcounted frames
mvcdec: convert to refcounted frames
paf: properly free the frame data on decode close
sgirle: convert to refcounted frames
lavfi/moviesrc: use refcounted frames
Michael Niedermayer (56):
Merge commit '759001c534287a96dc96d1e274665feb7059145d'
resolve conflicts in headers
motion_est: resolve conflict
mpeg4videodec: fix conflicts
dpcm conflict fix
dpx: fix conflicts
indeo3: resolve confilcts
kmvc: resolve conflicts
kmvc: resolve conflicts
h264: resolve conflicts
utils: resolve conflicts
rawdec: resolve conflcits
mpegvideo: resolve conflicts
svq1enc: resolve conflicts
mpegvideo: dont clear data, fix assertion failure on fate vsynth1 with threads
pthreads: resolve conflicts
frame_thread_encoder: simple compilefix not yet tested
snow: update to buffer refs
crytsalhd: fix compile
dirac: switch to new API
sonic: update to new API
svq1: resolve conflict, update to new API
ffwavesynth: update to new buffer API
g729: update to new API
indeo5: fix compile
j2kdec: update to new buffer API
linopencore-amr: fix compile
libvorbisdec: update to new API
loco: fix compile
paf: update to new API
proresdec: update to new API
vp56: update to new api / resolve conflicts
xface: convert to refcounted frames
xan: fix compile&fate
v408: update to ref counted buffers
v308: update to ref counted buffers
yuv4dec: update to ref counted buffers
y41p: update to ref counted frames
xbm: update to refcounted frames
targa_y216: update to refcounted buffers
qpeg: fix fate/crash
cdxl: fix fate
tscc: fix reget buffer useage
targa_y216dec: fix style
msmpeg4: fix fate
h264: ref_picture() copy fields that have been lost too
update_frame_pool: use channel field
h264: Put code that prevents deadlocks back
mpegvideo: dont allow last == current
wmalossless: fix buffer ref messup
ff_alloc_picture: free tables in case of dimension mismatches
h264: fix null pointer dereference and assertion failure
frame_thread_encoder: update to bufrefs
ec: fix used arrays
snowdec: fix off by 1 error in dimensions check
h264: disallow single unpaired fields as references of frames
Paul B Mahol (2):
lavc/vima: convert to refcounted frames
sanm: convert to refcounted frames
Conflicts:
libavcodec/4xm.c
libavcodec/8bps.c
libavcodec/8svx.c
libavcodec/aasc.c
libavcodec/alsdec.c
libavcodec/anm.c
libavcodec/ansi.c
libavcodec/avs.c
libavcodec/bethsoftvideo.c
libavcodec/bfi.c
libavcodec/c93.c
libavcodec/cavsdec.c
libavcodec/cdgraphics.c
libavcodec/cinepak.c
libavcodec/cljr.c
libavcodec/cscd.c
libavcodec/dnxhddec.c
libavcodec/dpcm.c
libavcodec/dpx.c
libavcodec/dsicinav.c
libavcodec/dvdec.c
libavcodec/dxa.c
libavcodec/eacmv.c
libavcodec/eamad.c
libavcodec/eatgq.c
libavcodec/eatgv.c
libavcodec/eatqi.c
libavcodec/error_resilience.c
libavcodec/escape124.c
libavcodec/ffv1.h
libavcodec/ffv1dec.c
libavcodec/flicvideo.c
libavcodec/fraps.c
libavcodec/frwu.c
libavcodec/g723_1.c
libavcodec/gifdec.c
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_direct.c
libavcodec/h264_loopfilter.c
libavcodec/h264_refs.c
libavcodec/huffyuvdec.c
libavcodec/idcinvideo.c
libavcodec/iff.c
libavcodec/indeo2.c
libavcodec/indeo3.c
libavcodec/internal.h
libavcodec/interplayvideo.c
libavcodec/ivi_common.c
libavcodec/jvdec.c
libavcodec/kgv1dec.c
libavcodec/kmvc.c
libavcodec/lagarith.c
libavcodec/libopenjpegdec.c
libavcodec/mdec.c
libavcodec/mimic.c
libavcodec/mjpegbdec.c
libavcodec/mjpegdec.c
libavcodec/mmvideo.c
libavcodec/motion_est.c
libavcodec/motionpixels.c
libavcodec/mpc7.c
libavcodec/mpeg12.c
libavcodec/mpeg4videodec.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h
libavcodec/msrle.c
libavcodec/msvideo1.c
libavcodec/nuv.c
libavcodec/options_table.h
libavcodec/pcx.c
libavcodec/pictordec.c
libavcodec/pngdec.c
libavcodec/pnmdec.c
libavcodec/pthread.c
libavcodec/qpeg.c
libavcodec/qtrle.c
libavcodec/r210dec.c
libavcodec/rawdec.c
libavcodec/roqvideodec.c
libavcodec/rpza.c
libavcodec/smacker.c
libavcodec/smc.c
libavcodec/svq1dec.c
libavcodec/svq1enc.c
libavcodec/targa.c
libavcodec/tiertexseqv.c
libavcodec/tiff.c
libavcodec/tmv.c
libavcodec/truemotion1.c
libavcodec/truemotion2.c
libavcodec/tscc.c
libavcodec/ulti.c
libavcodec/utils.c
libavcodec/utvideodec.c
libavcodec/v210dec.c
libavcodec/v210x.c
libavcodec/vb.c
libavcodec/vble.c
libavcodec/vcr1.c
libavcodec/vmdav.c
libavcodec/vmnc.c
libavcodec/vp3.c
libavcodec/vp56.c
libavcodec/vp56.h
libavcodec/vp6.c
libavcodec/vqavideo.c
libavcodec/wavpack.c
libavcodec/xl.c
libavcodec/xxan.c
libavcodec/zmbv.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mpegvideo_enc.c')
-rw-r--r-- | libavcodec/mpegvideo_enc.c | 102 |
1 files changed, 42 insertions, 60 deletions
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 1906a53b7d..b7839715be 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -174,7 +174,7 @@ void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix) */ void ff_init_qscale_tab(MpegEncContext *s) { - int8_t * const qscale_table = s->current_picture.f.qscale_table; + int8_t * const qscale_table = s->current_picture.qscale_table; int i; for (i = 0; i < s->mb_num; i++) { @@ -970,9 +970,9 @@ static int get_intra_count(MpegEncContext *s, uint8_t *src, static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg) { - AVFrame *pic = NULL; + Picture *pic = NULL; int64_t pts; - int i, display_picture_number = 0; + int i, display_picture_number = 0, ret; const int encoding_delay = s->max_b_frames ? s->max_b_frames : (s->low_delay ? 0 : 1); int direct = 1; @@ -1011,7 +1011,7 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg) } if (pic_arg) { - if (encoding_delay && !(s->flags & CODEC_FLAG_INPUT_PRESERVED)) + if (!pic_arg->buf[0]); direct = 0; if (pic_arg->linesize[0] != s->linesize) direct = 0; @@ -1028,14 +1028,12 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg) if (i < 0) return i; - pic = &s->picture[i].f; + pic = &s->picture[i]; pic->reference = 3; - for (i = 0; i < 4; i++) { - pic->data[i] = pic_arg->data[i]; - pic->linesize[i] = pic_arg->linesize[i]; - } - if (ff_alloc_picture(s, (Picture *) pic, 1) < 0) { + if ((ret = av_frame_ref(&pic->f, pic_arg)) < 0) + return ret; + if (ff_alloc_picture(s, pic, 1) < 0) { return -1; } } else { @@ -1043,16 +1041,16 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg) if (i < 0) return i; - pic = &s->picture[i].f; + pic = &s->picture[i]; pic->reference = 3; - if (ff_alloc_picture(s, (Picture *) pic, 0) < 0) { + if (ff_alloc_picture(s, pic, 0) < 0) { return -1; } - if (pic->data[0] + INPLACE_OFFSET == pic_arg->data[0] && - pic->data[1] + INPLACE_OFFSET == pic_arg->data[1] && - pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]) { + if (pic->f.data[0] + INPLACE_OFFSET == pic_arg->data[0] && + pic->f.data[1] + INPLACE_OFFSET == pic_arg->data[1] && + pic->f.data[2] + INPLACE_OFFSET == pic_arg->data[2]) { // empty } else { int h_chroma_shift, v_chroma_shift; @@ -1068,7 +1066,7 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg) int w = s->width >> h_shift; int h = s->height >> v_shift; uint8_t *src = pic_arg->data[i]; - uint8_t *dst = pic->data[i]; + uint8_t *dst = pic->f.data[i]; if (s->codec_id == AV_CODEC_ID_AMV && !(s->avctx->flags & CODEC_FLAG_EMU_EDGE)) { h = ((s->height + 15)/16*16) >> v_shift; @@ -1098,9 +1096,9 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg) } } } - copy_picture_attributes(s, pic, pic_arg); - pic->display_picture_number = display_picture_number; - pic->pts = pts; // we set this here to avoid modifiying pic_arg + copy_picture_attributes(s, &pic->f, pic_arg); + pic->f.display_picture_number = display_picture_number; + pic->f.pts = pts; // we set this here to avoid modifiying pic_arg } /* shift buffer entries */ @@ -1123,7 +1121,7 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref) const int bw = plane ? 1 : 2; for (y = 0; y < s->mb_height * bw; y++) { for (x = 0; x < s->mb_width * bw; x++) { - int off = p->f.type == FF_BUFFER_TYPE_SHARED ? 0 : 16; + int off = p->shared ? 0 : 16; uint8_t *dptr = p->f.data[plane] + 8 * (x + y * stride) + off; uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride); int v = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8); @@ -1219,7 +1217,7 @@ static int estimate_best_b_count(MpegEncContext *s) if (pre_input_ptr && (!i || s->input_picture[i - 1])) { pre_input = *pre_input_ptr; - if (pre_input.f.type != FF_BUFFER_TYPE_SHARED && i) { + if (!pre_input.shared && i) { pre_input.f.data[0] += INPLACE_OFFSET; pre_input.f.data[1] += INPLACE_OFFSET; pre_input.f.data[2] += INPLACE_OFFSET; @@ -1290,7 +1288,7 @@ static int estimate_best_b_count(MpegEncContext *s) static int select_input_picture(MpegEncContext *s) { - int i; + int i, ret; for (i = 1; i < MAX_PICTURE_COUNT; i++) s->reordered_input_picture[i - 1] = s->reordered_input_picture[i]; @@ -1311,17 +1309,7 @@ static int select_input_picture(MpegEncContext *s) if (s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)) { // FIXME check that te gop check above is +-1 correct - if (s->input_picture[0]->f.type == FF_BUFFER_TYPE_SHARED) { - for (i = 0; i < 4; i++) - s->input_picture[0]->f.data[i] = NULL; - s->input_picture[0]->f.type = 0; - } else { - assert(s->input_picture[0]->f.type == FF_BUFFER_TYPE_USER || - s->input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL); - - s->avctx->release_buffer(s->avctx, - &s->input_picture[0]->f); - } + av_frame_unref(&s->input_picture[0]->f); emms_c(); ff_vbv_update(s, 0); @@ -1425,14 +1413,15 @@ static int select_input_picture(MpegEncContext *s) } no_output_pic: if (s->reordered_input_picture[0]) { - s->reordered_input_picture[0]->f.reference = + s->reordered_input_picture[0]->reference = s->reordered_input_picture[0]->f.pict_type != AV_PICTURE_TYPE_B ? 3 : 0; - ff_copy_picture(&s->new_picture, s->reordered_input_picture[0]); + ff_mpeg_unref_picture(s, &s->new_picture); + if ((ret = ff_mpeg_ref_picture(s, &s->new_picture, s->reordered_input_picture[0]))) + return ret; - if (s->reordered_input_picture[0]->f.type == FF_BUFFER_TYPE_SHARED || - s->avctx->rc_buffer_size) { + if (s->reordered_input_picture[0]->shared || s->avctx->rc_buffer_size) { // input is a shared pix, so we can't modifiy it -> alloc a new // one & ensure that the shared one is reuseable @@ -1442,41 +1431,34 @@ no_output_pic: return i; pic = &s->picture[i]; - pic->f.reference = s->reordered_input_picture[0]->f.reference; + pic->reference = s->reordered_input_picture[0]->reference; if (ff_alloc_picture(s, pic, 0) < 0) { return -1; } - /* mark us unused / free shared pic */ - if (s->reordered_input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL) - s->avctx->release_buffer(s->avctx, - &s->reordered_input_picture[0]->f); - for (i = 0; i < 4; i++) - s->reordered_input_picture[0]->f.data[i] = NULL; - s->reordered_input_picture[0]->f.type = 0; - copy_picture_attributes(s, &pic->f, &s->reordered_input_picture[0]->f); + /* mark us unused / free shared pic */ + av_frame_unref(&s->reordered_input_picture[0]->f); + s->reordered_input_picture[0]->shared = 0; + s->current_picture_ptr = pic; } else { // input is not a shared pix -> reuse buffer for current_pix - - assert(s->reordered_input_picture[0]->f.type == - FF_BUFFER_TYPE_USER || - s->reordered_input_picture[0]->f.type == - FF_BUFFER_TYPE_INTERNAL); - s->current_picture_ptr = s->reordered_input_picture[0]; for (i = 0; i < 4; i++) { s->new_picture.f.data[i] += INPLACE_OFFSET; } } - ff_copy_picture(&s->current_picture, s->current_picture_ptr); + ff_mpeg_unref_picture(s, &s->current_picture); + if ((ret = ff_mpeg_ref_picture(s, &s->current_picture, + s->current_picture_ptr)) < 0) + return ret; s->picture_number = s->new_picture.f.display_picture_number; } else { - memset(&s->new_picture, 0, sizeof(Picture)); + ff_mpeg_unref_picture(s, &s->new_picture); } return 0; } @@ -1827,7 +1809,7 @@ static av_always_inline void encode_mb_internal(MpegEncContext *s, update_qscale(s); if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) { - s->qscale = s->current_picture_ptr->f.qscale_table[mb_xy]; + s->qscale = s->current_picture_ptr->qscale_table[mb_xy]; s->dquant = s->qscale - last_qp; if (s->out_format == FMT_H263) { @@ -2726,8 +2708,8 @@ static int encode_thread(AVCodecContext *c, void *arg){ s->mv_type = MV_TYPE_8X8; s->mb_intra= 0; for(i=0; i<4; i++){ - s->mv[0][i][0] = s->current_picture.f.motion_val[0][s->block_index[i]][0]; - s->mv[0][i][1] = s->current_picture.f.motion_val[0][s->block_index[i]][1]; + s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0]; + s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1]; } encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb, &dmin, &next_block, 0, 0); @@ -2914,7 +2896,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ } } - s->current_picture.f.qscale_table[xy] = best_s.qscale; + s->current_picture.qscale_table[xy] = best_s.qscale; copy_context_after_encode(s, &best_s, -1); @@ -2981,8 +2963,8 @@ static int encode_thread(AVCodecContext *c, void *arg){ s->mv_type = MV_TYPE_8X8; s->mb_intra= 0; for(i=0; i<4; i++){ - s->mv[0][i][0] = s->current_picture.f.motion_val[0][s->block_index[i]][0]; - s->mv[0][i][1] = s->current_picture.f.motion_val[0][s->block_index[i]][1]; + s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0]; + s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1]; } break; case CANDIDATE_MB_TYPE_DIRECT: |