mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/mpegvideo_enc: Unify initializing PutBitContexts
This also rids us of the requirement to preserve the PutBitContext in ff_update_duplicate_context(). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
a05eebee99
commit
4f2719a239
|
@ -471,7 +471,6 @@ static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
|
||||||
COPY(start_mb_y);
|
COPY(start_mb_y);
|
||||||
COPY(end_mb_y);
|
COPY(end_mb_y);
|
||||||
COPY(me.map_generation);
|
COPY(me.map_generation);
|
||||||
COPY(pb);
|
|
||||||
COPY(dct_error_sum);
|
COPY(dct_error_sum);
|
||||||
COPY(dct_count[0]);
|
COPY(dct_count[0]);
|
||||||
COPY(dct_count[1]);
|
COPY(dct_count[1]);
|
||||||
|
|
|
@ -84,7 +84,7 @@
|
||||||
#define QMAT_SHIFT_MMX 16
|
#define QMAT_SHIFT_MMX 16
|
||||||
#define QMAT_SHIFT 21
|
#define QMAT_SHIFT 21
|
||||||
|
|
||||||
static int encode_picture(MpegEncContext *s);
|
static int encode_picture(MpegEncContext *s, const AVPacket *pkt);
|
||||||
static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
|
static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale);
|
||||||
static int sse_mb(MpegEncContext *s);
|
static int sse_mb(MpegEncContext *s);
|
||||||
static void denoise_dct_c(MpegEncContext *s, int16_t *block);
|
static void denoise_dct_c(MpegEncContext *s, int16_t *block);
|
||||||
|
@ -1669,7 +1669,6 @@ static int select_input_picture(MpegEncContext *s)
|
||||||
ff_mpv_unref_picture(&s->cur_pic);
|
ff_mpv_unref_picture(&s->cur_pic);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
s->me.temp = s->me.scratchpad = s->sc.scratchpad_buf;
|
|
||||||
s->picture_number = s->cur_pic.ptr->display_picture_number;
|
s->picture_number = s->cur_pic.ptr->display_picture_number;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1755,7 +1754,7 @@ int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
|
||||||
const AVFrame *pic_arg, int *got_packet)
|
const AVFrame *pic_arg, int *got_packet)
|
||||||
{
|
{
|
||||||
MpegEncContext *s = avctx->priv_data;
|
MpegEncContext *s = avctx->priv_data;
|
||||||
int i, stuffing_count, ret;
|
int stuffing_count, ret;
|
||||||
int context_count = s->slice_context_count;
|
int context_count = s->slice_context_count;
|
||||||
|
|
||||||
ff_mpv_unref_picture(&s->cur_pic);
|
ff_mpv_unref_picture(&s->cur_pic);
|
||||||
|
@ -1791,21 +1790,11 @@ int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
|
||||||
s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
|
s->prev_mb_info = s->last_mb_info = s->mb_info_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < context_count; i++) {
|
|
||||||
int start_y = s->thread_context[i]->start_mb_y;
|
|
||||||
int end_y = s->thread_context[i]-> end_mb_y;
|
|
||||||
int h = s->mb_height;
|
|
||||||
uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
|
|
||||||
uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h);
|
|
||||||
|
|
||||||
init_put_bits(&s->thread_context[i]->pb, start, end - start);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->pict_type = s->new_pic->pict_type;
|
s->pict_type = s->new_pic->pict_type;
|
||||||
//emms_c();
|
//emms_c();
|
||||||
frame_start(s);
|
frame_start(s);
|
||||||
vbv_retry:
|
vbv_retry:
|
||||||
ret = encode_picture(s);
|
ret = encode_picture(s, pkt);
|
||||||
if (growing_buffer) {
|
if (growing_buffer) {
|
||||||
av_assert0(s->pb.buf == avctx->internal->byte_buffer);
|
av_assert0(s->pb.buf == avctx->internal->byte_buffer);
|
||||||
pkt->data = s->pb.buf;
|
pkt->data = s->pb.buf;
|
||||||
|
@ -1849,10 +1838,6 @@ vbv_retry:
|
||||||
s->time_base = s->last_time_base;
|
s->time_base = s->last_time_base;
|
||||||
s->last_non_b_time = s->time - s->pp_time;
|
s->last_non_b_time = s->time - s->pp_time;
|
||||||
}
|
}
|
||||||
for (i = 0; i < context_count; i++) {
|
|
||||||
PutBitContext *pb = &s->thread_context[i]->pb;
|
|
||||||
init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
|
|
||||||
}
|
|
||||||
s->vbv_ignore_qmax = 1;
|
s->vbv_ignore_qmax = 1;
|
||||||
av_log(avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n");
|
av_log(avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n");
|
||||||
goto vbv_retry;
|
goto vbv_retry;
|
||||||
|
@ -3564,7 +3549,7 @@ static void set_frame_distances(MpegEncContext * s){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int encode_picture(MpegEncContext *s)
|
static int encode_picture(MpegEncContext *s, const AVPacket *pkt)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
int bits;
|
int bits;
|
||||||
|
@ -3616,12 +3601,23 @@ static int encode_picture(MpegEncContext *s)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
s->mb_intra=0; //for the rate distortion & bit compare functions
|
s->mb_intra=0; //for the rate distortion & bit compare functions
|
||||||
for(i=1; i<context_count; i++){
|
for (int i = 0; i < context_count; i++) {
|
||||||
MpegEncContext *const slice = s->thread_context[i];
|
MpegEncContext *const slice = s->thread_context[i];
|
||||||
ret = ff_update_duplicate_context(slice, s);
|
uint8_t *start, *end;
|
||||||
if (ret < 0)
|
int h;
|
||||||
return ret;
|
|
||||||
|
if (i) {
|
||||||
|
ret = ff_update_duplicate_context(slice, s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
slice->me.temp = slice->me.scratchpad = slice->sc.scratchpad_buf;
|
slice->me.temp = slice->me.scratchpad = slice->sc.scratchpad_buf;
|
||||||
|
|
||||||
|
h = s->mb_height;
|
||||||
|
start = pkt->data + (size_t)(((int64_t) pkt->size) * slice->start_mb_y / h);
|
||||||
|
end = pkt->data + (size_t)(((int64_t) pkt->size) * slice-> end_mb_y / h);
|
||||||
|
|
||||||
|
init_put_bits(&s->thread_context[i]->pb, start, end - start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Estimate motion for every MB */
|
/* Estimate motion for every MB */
|
||||||
|
|
Loading…
Reference in New Issue