diff mbox series

[FFmpeg-devel,4/5] lavc/openh264enc: export encoded frame stats

Message ID 1595763675-1857-4-git-send-email-mypopydev@gmail.com
State Superseded
Headers show
Series [FFmpeg-devel,1/5] lavc/libkvazaar: fix framerate setting | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Jun Zhao July 26, 2020, 11:41 a.m. UTC
From: Jun Zhao <barryjzhao@tencent.com>

Export choosen pict_type and qp.

NOTE: now libopenh264enc always export the the average QP with
zero. And I have opened a issue for libopenh264 in
https://github.com/cisco/openh264/issues/3317

Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
---
 libavcodec/libopenh264enc.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
diff mbox series

Patch

diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index cf48566..5d934b4 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -31,6 +31,7 @@ 
 
 #include "avcodec.h"
 #include "internal.h"
+#include "packet_internal.h"
 #include "libopenh264.h"
 
 #if !OPENH264_VER_AT_LEAST(1, 6)
@@ -376,6 +377,8 @@  static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
     SSourcePicture sp = { 0 };
     int size = 0, layer, first_layer = 0;
     int layer_size[MAX_LAYER_NUM_OF_FRAME] = { 0 };
+    int pict_type;
+    SEncoderStatistics stat = { 0 };
 
     sp.iColorFormat = videoFormatI420;
     for (i = 0; i < 3; i++) {
@@ -426,6 +429,34 @@  static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
     avpkt->pts = frame->pts;
     if (fbi.eFrameType == videoFrameTypeIDR)
         avpkt->flags |= AV_PKT_FLAG_KEY;
+
+    (*s->encoder)->GetOption(s->encoder, ENCODER_OPTION_GET_STATISTICS, &stat);
+    switch (fbi.eFrameType) {
+    case videoFrameTypeIDR:
+    case videoFrameTypeI:
+        pict_type = AV_PICTURE_TYPE_I;
+        break;
+    case videoFrameTypeP:
+        pict_type = AV_PICTURE_TYPE_P;
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unknown picture type encountered.\n");
+        return AVERROR_EXTERNAL;
+    }
+#if FF_API_CODED_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+    avctx->coded_frame->pict_type = pict_type;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
+    ff_side_data_set_encoder_stats(avpkt, stat.uiAverageFrameQP * FF_QP2LAMBDA, NULL, 0, pict_type);
+
+#if FF_API_CODED_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+    avctx->coded_frame->quality = stat.uiAverageFrameQP * FF_QP2LAMBDA;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
     *got_packet = 1;
     return 0;
 }