[FFmpeg-devel] [PATCH 4/4] nvenc: Try and do interlaced encoding.

Philip Langdale philipl at overt.org
Tue Jan 6 08:36:18 CET 2015


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;
-- 
2.1.0



More information about the ffmpeg-devel mailing list