Do it only when requested with the AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS flag. Drop previous code using the long-deprecated AV_FRAME_DATA_QP_TABLE* API. Temporarily disable fate-filter-pp, fate-filter-pp7, fate-filter-spp. They will be reenabled once these filters are converted in following commits.tags/n4.4
| @@ -15,6 +15,9 @@ libavutil: 2017-10-21 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2020-xx-xx - xxxxxxxxxx - lavu 56.63.100 - video_enc_params.h | |||||
| Add AV_VIDEO_ENC_PARAMS_MPEG2 | |||||
| 2020-12-03 - xxxxxxxxxx - lavu 56.62.100 - timecode.h | 2020-12-03 - xxxxxxxxxx - lavu 56.62.100 - timecode.h | ||||
| Add av_timecode_init_from_components. | Add av_timecode_init_from_components. | ||||
| @@ -28,6 +28,8 @@ | |||||
| #define UNCHECKED_BITSTREAM_READER 1 | #define UNCHECKED_BITSTREAM_READER 1 | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/video_enc_params.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "error_resilience.h" | #include "error_resilience.h" | ||||
| #include "flv.h" | #include "flv.h" | ||||
| @@ -33,6 +33,7 @@ | |||||
| #include "libavutil/internal.h" | #include "libavutil/internal.h" | ||||
| #include "libavutil/mem_internal.h" | #include "libavutil/mem_internal.h" | ||||
| #include "libavutil/stereo3d.h" | #include "libavutil/stereo3d.h" | ||||
| #include "libavutil/video_enc_params.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| @@ -220,6 +220,7 @@ static int alloc_picture_tables(AVCodecContext *avctx, Picture *pic, int encodin | |||||
| pic->alloc_mb_width = mb_width; | pic->alloc_mb_width = mb_width; | ||||
| pic->alloc_mb_height = mb_height; | pic->alloc_mb_height = mb_height; | ||||
| pic->alloc_mb_stride = mb_stride; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -346,6 +347,7 @@ int ff_update_picture_tables(Picture *dst, Picture *src) | |||||
| dst->alloc_mb_width = src->alloc_mb_width; | dst->alloc_mb_width = src->alloc_mb_width; | ||||
| dst->alloc_mb_height = src->alloc_mb_height; | dst->alloc_mb_height = src->alloc_mb_height; | ||||
| dst->alloc_mb_stride = src->alloc_mb_stride; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -69,6 +69,7 @@ typedef struct Picture { | |||||
| int alloc_mb_width; ///< mb_width used to allocate tables | int alloc_mb_width; ///< mb_width used to allocate tables | ||||
| int alloc_mb_height; ///< mb_height used to allocate tables | int alloc_mb_height; ///< mb_height used to allocate tables | ||||
| int alloc_mb_stride; ///< mb_stride used to allocate tables | |||||
| AVBufferRef *mb_mean_buf; | AVBufferRef *mb_mean_buf; | ||||
| uint8_t *mb_mean; ///< Table for MB luminance | uint8_t *mb_mean; ///< Table for MB luminance | ||||
| @@ -32,6 +32,8 @@ | |||||
| #include "libavutil/imgutils.h" | #include "libavutil/imgutils.h" | ||||
| #include "libavutil/internal.h" | #include "libavutil/internal.h" | ||||
| #include "libavutil/motion_vector.h" | #include "libavutil/motion_vector.h" | ||||
| #include "libavutil/video_enc_params.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "blockdsp.h" | #include "blockdsp.h" | ||||
| #include "h264chroma.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) | 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); | 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, | static inline int hpel_motion_lowres(MpegEncContext *s, | ||||
| @@ -29,6 +29,7 @@ | |||||
| #include "libavutil/internal.h" | #include "libavutil/internal.h" | ||||
| #include "libavutil/mem_internal.h" | #include "libavutil/mem_internal.h" | ||||
| #include "libavutil/thread.h" | #include "libavutil/thread.h" | ||||
| #include "libavutil/video_enc_params.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "error_resilience.h" | #include "error_resilience.h" | ||||
| @@ -79,7 +79,7 @@ | |||||
| */ | */ | ||||
| #define LIBAVUTIL_VERSION_MAJOR 56 | #define LIBAVUTIL_VERSION_MAJOR 56 | ||||
| #define LIBAVUTIL_VERSION_MINOR 62 | |||||
| #define LIBAVUTIL_VERSION_MINOR 63 | |||||
| #define LIBAVUTIL_VERSION_MICRO 100 | #define LIBAVUTIL_VERSION_MICRO 100 | ||||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||
| @@ -55,6 +55,14 @@ enum AVVideoEncParamsType { | |||||
| * as AVVideoBlockParams.qp_delta. | * as AVVideoBlockParams.qp_delta. | ||||
| */ | */ | ||||
| AV_VIDEO_ENC_PARAMS_H264, | AV_VIDEO_ENC_PARAMS_H264, | ||||
| /* | |||||
| * MPEG-2-compatible quantizer. | |||||
| * | |||||
| * Summing the frame-level qp with the per-block delta_qp gives the | |||||
| * resulting quantizer for the block. | |||||
| */ | |||||
| AV_VIDEO_ENC_PARAMS_MPEG2, | |||||
| }; | }; | ||||
| /** | /** | ||||
| @@ -561,7 +561,7 @@ fate-filter-idet: CMD = framecrc -flags bitexact -idct simple -i $(SRC) -vf idet | |||||
| FATE_FILTER_VSYNTH-$(CONFIG_PAD_FILTER) += fate-filter-pad | FATE_FILTER_VSYNTH-$(CONFIG_PAD_FILTER) += fate-filter-pad | ||||
| fate-filter-pad: CMD = video_filter "pad=iw*1.5:ih*1.5:iw*0.3:ih*0.2" | fate-filter-pad: CMD = video_filter "pad=iw*1.5:ih*1.5:iw*0.3:ih*0.2" | ||||
| FATE_FILTER_PP = fate-filter-pp fate-filter-pp1 fate-filter-pp2 fate-filter-pp3 fate-filter-pp4 fate-filter-pp5 fate-filter-pp6 | |||||
| #FATE_FILTER_PP = fate-filter-pp fate-filter-pp1 fate-filter-pp2 fate-filter-pp3 fate-filter-pp4 fate-filter-pp5 fate-filter-pp6 | |||||
| FATE_FILTER_VSYNTH-$(CONFIG_PP_FILTER) += $(FATE_FILTER_PP) | FATE_FILTER_VSYNTH-$(CONFIG_PP_FILTER) += $(FATE_FILTER_PP) | ||||
| $(FATE_FILTER_PP): fate-vsynth1-mpeg4-qprd | $(FATE_FILTER_PP): fate-vsynth1-mpeg4-qprd | ||||
| @@ -573,11 +573,11 @@ fate-filter-pp4: CMD = video_filter "pp=be/ci" | |||||
| fate-filter-pp5: CMD = video_filter "pp=md" | fate-filter-pp5: CMD = video_filter "pp=md" | ||||
| fate-filter-pp6: CMD = video_filter "pp=be/fd" | fate-filter-pp6: CMD = video_filter "pp=be/fd" | ||||
| FATE_FILTER_VSYNTH-$(CONFIG_PP7_FILTER) += fate-filter-pp7 | |||||
| #FATE_FILTER_VSYNTH-$(CONFIG_PP7_FILTER) += fate-filter-pp7 | |||||
| fate-filter-pp7: fate-vsynth1-mpeg4-qprd | fate-filter-pp7: fate-vsynth1-mpeg4-qprd | ||||
| fate-filter-pp7: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_PATH)/tests/data/fate/vsynth1-mpeg4-qprd.avi -frames:v 5 -flags +bitexact -vf "pp7" | fate-filter-pp7: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_PATH)/tests/data/fate/vsynth1-mpeg4-qprd.avi -frames:v 5 -flags +bitexact -vf "pp7" | ||||
| FATE_FILTER_VSYNTH-$(CONFIG_SPP_FILTER) += fate-filter-spp | |||||
| #FATE_FILTER_VSYNTH-$(CONFIG_SPP_FILTER) += fate-filter-spp | |||||
| fate-filter-spp: fate-vsynth1-mpeg4-qprd | fate-filter-spp: fate-vsynth1-mpeg4-qprd | ||||
| fate-filter-spp: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_PATH)/tests/data/fate/vsynth1-mpeg4-qprd.avi -frames:v 5 -flags +bitexact -vf "spp=idct=simple:dct=int" | fate-filter-spp: CMD = framecrc -flags bitexact -idct simple -i $(TARGET_PATH)/tests/data/fate/vsynth1-mpeg4-qprd.avi -frames:v 5 -flags +bitexact -vf "spp=idct=simple:dct=int" | ||||