diff mbox

[FFmpeg-devel] lavc/vaapi_encode: enable "force_key_frames" option in vaapi_encode

Message ID b1d322f2-8f44-1008-05ec-405bbb5f7028@gmail.com
State New
Headers show

Commit Message

Jun Zhao Jan. 9, 2017, 6:19 a.m. UTC
From 40804a849556e1303f6351f5560d5552e2588b12 Mon Sep 17 00:00:00 2001
From: Jun Zhao <jun.zhao@intel.com>
Date: Mon, 9 Jan 2017 14:05:59 +0800
Subject: [PATCH] lavc/vaapi_encode: enable "force_key_frames" option in
 vaapi_encode

enable the opt "force_key_frame" to force IDR output in vaapi_encode,
and this option can take a expression as an argument, allowing
functionality such as forcing a key frame(IDR frame) every 5 seconds
like:

-force_key_frames 'expr:gte(t,n_forced*5)'

Signed-off-by: Wang, Yi A <yi.a.wang@intel.com>
Signed-off-by: Jun Zhao <jun.zhao@intel.com>
---
 libavcodec/vaapi_encode.c | 24 +++++++++++++++---------
 libavcodec/vaapi_encode.h |  1 +
 2 files changed, 16 insertions(+), 9 deletions(-)

Comments

Mark Thompson Jan. 11, 2017, 8:39 p.m. UTC | #1
On 09/01/17 06:19, Jun Zhao wrote:
> From 40804a849556e1303f6351f5560d5552e2588b12 Mon Sep 17 00:00:00 2001
> From: Jun Zhao <jun.zhao@intel.com>
> Date: Mon, 9 Jan 2017 14:05:59 +0800
> Subject: [PATCH] lavc/vaapi_encode: enable "force_key_frames" option in
>  vaapi_encode
> 
> enable the opt "force_key_frame" to force IDR output in vaapi_encode,
> and this option can take a expression as an argument, allowing
> functionality such as forcing a key frame(IDR frame) every 5 seconds
> like:
> 
> -force_key_frames 'expr:gte(t,n_forced*5)'
> 
> Signed-off-by: Wang, Yi A <yi.a.wang@intel.com>
> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
> ---
>  libavcodec/vaapi_encode.c | 24 +++++++++++++++---------
>  libavcodec/vaapi_encode.h |  1 +
>  2 files changed, 16 insertions(+), 9 deletions(-)

<https://lists.libav.org/pipermail/libav-devel/2017-January/081621.html> ?

(It is my intent to merge libav VAAPI changes more agressively now, the decode set a few days ago was the start of that.)

- Mark
Jun Zhao Jan. 12, 2017, 12:37 a.m. UTC | #2
On 2017/1/12 4:39, Mark Thompson wrote:
> On 09/01/17 06:19, Jun Zhao wrote:
>> From 40804a849556e1303f6351f5560d5552e2588b12 Mon Sep 17 00:00:00 2001
>> From: Jun Zhao <jun.zhao@intel.com>
>> Date: Mon, 9 Jan 2017 14:05:59 +0800
>> Subject: [PATCH] lavc/vaapi_encode: enable "force_key_frames" option in
>>  vaapi_encode
>>
>> enable the opt "force_key_frame" to force IDR output in vaapi_encode,
>> and this option can take a expression as an argument, allowing
>> functionality such as forcing a key frame(IDR frame) every 5 seconds
>> like:
>>
>> -force_key_frames 'expr:gte(t,n_forced*5)'
>>
>> Signed-off-by: Wang, Yi A <yi.a.wang@intel.com>
>> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
>> ---
>>  libavcodec/vaapi_encode.c | 24 +++++++++++++++---------
>>  libavcodec/vaapi_encode.h |  1 +
>>  2 files changed, 16 insertions(+), 9 deletions(-)
> 
> <https://lists.libav.org/pipermail/libav-devel/2017-January/081621.html> ?
> 
> (It is my intent to merge libav VAAPI changes more agressively now, the decode set a few days ago was the start of that.)

I see, please continue merge the libav VAAPI changes.

> 
> - Mark
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
diff mbox

Patch

diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index a3c9991..26694aa 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -28,7 +28,7 @@ 
 #include "avcodec.h"
 
 static const char *picture_type_name[] = { "IDR", "I", "P", "B" };
-
+static int vaapi_encode_mangle_end(AVCodecContext *avctx);
 static int vaapi_encode_make_packed_header(AVCodecContext *avctx,
                                            VAAPIEncodePicture *pic,
                                            int type, char *data, size_t bit_len)
@@ -626,12 +626,16 @@  static int vaapi_encode_get_next(AVCodecContext *avctx,
     VAAPIEncodePicture *start, *end, *pic;
     int i;
 
-    for (pic = ctx->pic_start; pic; pic = pic->next) {
-        if (pic->next)
-            av_assert0(pic->display_order + 1 == pic->next->display_order);
-        if (pic->display_order == ctx->input_order) {
-            *pic_out = pic;
-            return 0;
+    if (ctx->force_idr_frame) {
+        vaapi_encode_mangle_end(avctx);
+    } else {
+        for (pic = ctx->pic_start; pic; pic = pic->next) {
+            if (pic->next)
+                av_assert0(pic->display_order + 1 == pic->next->display_order);
+            if (pic->display_order == ctx->input_order) {
+                *pic_out = pic;
+                return 0;
+            }
         }
     }
 
@@ -657,14 +661,15 @@  static int vaapi_encode_get_next(AVCodecContext *avctx,
     if (!pic)
         return AVERROR(ENOMEM);
 
-    if (ctx->p_per_i == 0 || ctx->p_counter == ctx->p_per_i) {
-        if (ctx->i_per_idr == 0 || ctx->i_counter == ctx->i_per_idr) {
+    if (ctx->force_idr_frame == 1 || ctx->p_per_i == 0 || ctx->p_counter == ctx->p_per_i) {
+        if (ctx->force_idr_frame == 1 || ctx->i_per_idr == 0 || ctx->i_counter == ctx->i_per_idr) {
             pic->type = PICTURE_TYPE_IDR;
             ctx->i_counter = 0;
         } else {
             pic->type = PICTURE_TYPE_I;
             ++ctx->i_counter;
         }
+        ctx->force_idr_frame = 0;
         ctx->p_counter = 0;
     } else {
         pic->type = PICTURE_TYPE_P;
@@ -834,6 +839,7 @@  int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt,
         av_log(avctx, AV_LOG_DEBUG, "Encode frame: %ux%u (%"PRId64").\n",
                input_image->width, input_image->height, input_image->pts);
 
+        ctx->force_idr_frame = (input_image->pict_type == AV_PICTURE_TYPE_I ? 1 : 0) ;
         err = vaapi_encode_get_next(avctx, &pic);
         if (err) {
             av_log(avctx, AV_LOG_ERROR, "Input setup failed: %d.\n", err);
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index cc05ac8..63b3e51 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -197,6 +197,7 @@  typedef struct VAAPIEncodeContext {
     int i_counter;
     int p_counter;
     int end_of_stream;
+    int force_idr_frame;
 
     // Codec-local options are allocated to follow this structure in
     // memory (in the AVCodec definition, set priv_data_size to