[FFmpeg-devel] [PATCH 4/4] nvenc: Try and do interlaced encoding.
Agatha Hu
ahu at nvidia.com
Wed Jan 7 04:01:58 CET 2015
On 2015/1/6 15:36, Philip Langdale wrote:
> Doesn't work.
>
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
> libavcodec/libnvenc.c | 7 +++++++
> libavcodec/libnvenc.h | 3 +++
> libavcodec/nvencoder.c | 6 ++++--
> 3 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/libnvenc.c b/libavcodec/libnvenc.c
> index 3c64234..83587a6 100644
> --- a/libavcodec/libnvenc.c
> +++ b/libavcodec/libnvenc.c
> @@ -189,6 +189,9 @@ static av_cold int ff_libnvenc_init(AVCodecContext *avctx)
> if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER)
> nvenc_ctx->nvenc_cfg.enableRepeatSPSPPS = 0;
>
> + if (avctx->flags & CODEC_FLAG_INTERLACED_DCT)
> + nvenc_ctx->nvenc_cfg.interlaced = 1;
> +
> // Allocate list of x264 options
> x264_argc = 0;
> x264_argv = av_calloc(255, sizeof(char*));
> @@ -299,6 +302,10 @@ static int ff_libnvenc_encode(AVCodecContext *avctx, AVPacket *pkt, const AVFram
> nvenc_frame.width = avctx->width;
> nvenc_frame.height = avctx->height;
> nvenc_frame.format = map_avpixfmt_bufferformat(avctx->pix_fmt);
> + if (avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
> + nvenc_frame.interlaced = 1;
> + nvenc_frame.top_field_first = frame->top_field_first;
> + }
> }
>
> // Setup output
> diff --git a/libavcodec/libnvenc.h b/libavcodec/libnvenc.h
> index 63b5d67..76cb379 100644
> --- a/libavcodec/libnvenc.h
> +++ b/libavcodec/libnvenc.h
> @@ -91,6 +91,7 @@ typedef struct nvenc_cfg_t
> uint32_t sliceMode;
> uint32_t sliceModeData;
> uint32_t disableDeblockingFilterIDC;
> + bool interlaced;
>
> // x264-style list of options
> char **x264_paramv;
> @@ -112,6 +113,8 @@ typedef struct nvenc_frame_t
> uint32_t frame_type;
> bool force_idr;
> bool force_intra;
> + bool interlaced;
> + bool top_field_first;
> } nvenc_frame_t;
>
> /**
> diff --git a/libavcodec/nvencoder.c b/libavcodec/nvencoder.c
> index 2135f55..198ee09 100644
> --- a/libavcodec/nvencoder.c
> +++ b/libavcodec/nvencoder.c
> @@ -478,7 +478,7 @@ static bool initialize(nvencoder_t *nvenc, nvenc_cfg_t *nvenc_cfg)
> nvenc->config.profileGUID = map_profile(nvenc_cfg->profile);
> nvenc->config.gopLength = nvenc_cfg->gopLength;
> nvenc->config.frameIntervalP = 1 + nvenc_cfg->numBFrames;
> - nvenc->config.frameFieldMode = NV_ENC_PARAMS_FRAME_FIELD_MODE_FRAME;
> + nvenc->config.frameFieldMode = nvenc_cfg->interlaced ? NV_ENC_PARAMS_FRAME_FIELD_MODE_FIELD : NV_ENC_PARAMS_FRAME_FIELD_MODE_FRAME;
> nvenc->config.mvPrecision = NV_ENC_MV_PRECISION_QUARTER_PEL;
>
> //NV_ENC_CODEC_CONFIG rate-control
> @@ -563,7 +563,9 @@ static bool encode_frame(nvencoder_t *nvenc, nvenc_frame_t *nvenc_frame, bool *o
> pic_params.inputBuffer = nvenc->i_buffer[nvenc->current_i % MAX_BUFFERS];
> pic_params.outputBitstream = nvenc->o_buffer[nvenc->current_o % MAX_BUFFERS];
> pic_params.bufferFmt = nvenc->buffer_fmt;
> - pic_params.pictureStruct = NV_ENC_PIC_STRUCT_FRAME;
> + pic_params.pictureStruct = nvenc_frame->interlaced ?
> + nvenc_frame->top_field_first ? NV_ENC_PIC_STRUCT_FIELD_TOP_BOTTOM : NV_ENC_PIC_STRUCT_FIELD_BOTTOM_TOP :
> + NV_ENC_PIC_STRUCT_FRAME;
> pic_params.frameIdx = nvenc_frame->frame_idx;
> if (nvenc_frame->force_idr)
> pic_params.encodePicFlags |= NV_ENC_PIC_FLAG_FORCEIDR;
>
OK let me take a look
More information about the ffmpeg-devel
mailing list