|
|
@@ -32,6 +32,8 @@ |
|
|
|
#include "libavutil/imgutils.h" |
|
|
|
#include "libavutil/internal.h" |
|
|
|
#include "libavutil/motion_vector.h" |
|
|
|
#include "libavutil/video_enc_params.h" |
|
|
|
|
|
|
|
#include "avcodec.h" |
|
|
|
#include "blockdsp.h" |
|
|
|
#include "h264chroma.h" |
|
|
@@ -1422,14 +1424,33 @@ void ff_print_debug_info(MpegEncContext *s, Picture *p, AVFrame *pict) |
|
|
|
|
|
|
|
int ff_mpv_export_qp_table(MpegEncContext *s, AVFrame *f, Picture *p, int qp_type) |
|
|
|
{ |
|
|
|
AVBufferRef *ref = av_buffer_ref(p->qscale_table_buf); |
|
|
|
int offset = 2*s->mb_stride + 1; |
|
|
|
if(!ref) |
|
|
|
AVVideoEncParams *par; |
|
|
|
int mult = (qp_type == FF_QSCALE_TYPE_MPEG1) ? 2 : 1; |
|
|
|
unsigned int nb_mb = p->alloc_mb_height * p->alloc_mb_width; |
|
|
|
unsigned int x, y; |
|
|
|
|
|
|
|
if (!(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS)) |
|
|
|
return 0; |
|
|
|
|
|
|
|
par = av_video_enc_params_create_side_data(f, AV_VIDEO_ENC_PARAMS_MPEG2, nb_mb); |
|
|
|
if (!par) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
av_assert0(ref->size >= offset + s->mb_stride * ((f->height+15)/16)); |
|
|
|
ref->size -= offset; |
|
|
|
ref->data += offset; |
|
|
|
return av_frame_set_qp_table(f, ref, s->mb_stride, qp_type); |
|
|
|
|
|
|
|
for (y = 0; y < p->alloc_mb_height; y++) |
|
|
|
for (x = 0; x < p->alloc_mb_width; x++) { |
|
|
|
const unsigned int block_idx = y * p->alloc_mb_width + x; |
|
|
|
const unsigned int mb_xy = y * p->alloc_mb_stride + x; |
|
|
|
AVVideoBlockParams *b = av_video_enc_params_block(par, block_idx); |
|
|
|
|
|
|
|
b->src_x = x * 16; |
|
|
|
b->src_y = y * 16; |
|
|
|
b->w = 16; |
|
|
|
b->h = 16; |
|
|
|
|
|
|
|
b->delta_qp = p->qscale_table[mb_xy] * mult; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static inline int hpel_motion_lowres(MpegEncContext *s, |
|
|
|