diff mbox

[FFmpeg-devel,v6,2/3] avcodec/libx264:setting profile and level in avcodec context

Message ID 1513248854-28686-1-git-send-email-vdixit@akamai.com
State Superseded
Headers show

Commit Message

Dixit, Vishwanath Dec. 14, 2017, 10:54 a.m. UTC
From: Vishwanath Dixit <vdixit@akamai.com>

---
 libavcodec/libx264.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

Mark Thompson Dec. 14, 2017, 12:56 p.m. UTC | #1
On 14/12/17 10:54, vdixit@akamai.com wrote:
> From: Vishwanath Dixit <vdixit@akamai.com>
> 
> ---
>  libavcodec/libx264.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
> index 9c67c91..ac1f8bb 100644
> --- a/libavcodec/libx264.c
> +++ b/libavcodec/libx264.c
> @@ -19,11 +19,13 @@
>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>   */
>  
> +#include "libavutil/avassert.h"
>  #include "libavutil/eval.h"
>  #include "libavutil/internal.h"
>  #include "libavutil/opt.h"
>  #include "libavutil/mem.h"
>  #include "libavutil/pixdesc.h"
> +#include "libavutil/reverse.h"
>  #include "libavutil/stereo3d.h"
>  #include "libavutil/intreadwrite.h"
>  #include "avcodec.h"
> @@ -454,6 +456,9 @@ static av_cold int X264_init(AVCodecContext *avctx)
>      X264Context *x4 = avctx->priv_data;
>      AVCPBProperties *cpb_props;
>      int sw,sh;
> +    x264_nal_t *nal;
> +    uint8_t *p;
> +    int nnal, s, i;

Minor style point (feel free to ignore): these variables don't all need to move to the outer scope.

>  
>      if (avctx->global_quality > 0)
>          av_log(avctx, AV_LOG_WARNING, "-qscale is ignored, -crf is recommended.\n");
> @@ -799,12 +804,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
>      if (!x4->enc)
>          return AVERROR_EXTERNAL;
>  
> -    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
> -        x264_nal_t *nal;
> -        uint8_t *p;
> -        int nnal, s, i;
> +    s = x264_encoder_headers(x4->enc, &nal, &nnal);
> +    // Assert for NAL start code and SPS unit type
> +    av_assert0((nal->p_payload[0] | nal->p_payload[1] | nal->p_payload[2]) == 0 && nal->p_payload[3] == 1);
> +    av_assert0((nal->p_payload[4] & 0x1F) == 7);
> +    // bits 0-7 LSB for profile. bits 8-11 for constrained set flags.

s/constrained/constraint/

> +    if (avctx->profile == FF_PROFILE_UNKNOWN)
> +        avctx->profile = ((uint32_t)nal->p_payload[5]) | ((uint32_t)ff_reverse[nal->p_payload[6]] << 8);
> +    if (avctx->level == FF_LEVEL_UNKNOWN)
> +        avctx->level = nal->p_payload[7];
>  
> -        s = x264_encoder_headers(x4->enc, &nal, &nnal);
> +    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
>          avctx->extradata = p = av_mallocz(s + AV_INPUT_BUFFER_PADDING_SIZE);
>          if (!p)
>              return AVERROR(ENOMEM);
> 

This patch LGTM.  (No comment on the HLS patches, I'm not familiar with that code.)

Thanks,

- Mark
diff mbox

Patch

diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 9c67c91..ac1f8bb 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -19,11 +19,13 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avassert.h"
 #include "libavutil/eval.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 #include "libavutil/mem.h"
 #include "libavutil/pixdesc.h"
+#include "libavutil/reverse.h"
 #include "libavutil/stereo3d.h"
 #include "libavutil/intreadwrite.h"
 #include "avcodec.h"
@@ -454,6 +456,9 @@  static av_cold int X264_init(AVCodecContext *avctx)
     X264Context *x4 = avctx->priv_data;
     AVCPBProperties *cpb_props;
     int sw,sh;
+    x264_nal_t *nal;
+    uint8_t *p;
+    int nnal, s, i;
 
     if (avctx->global_quality > 0)
         av_log(avctx, AV_LOG_WARNING, "-qscale is ignored, -crf is recommended.\n");
@@ -799,12 +804,17 @@  FF_ENABLE_DEPRECATION_WARNINGS
     if (!x4->enc)
         return AVERROR_EXTERNAL;
 
-    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
-        x264_nal_t *nal;
-        uint8_t *p;
-        int nnal, s, i;
+    s = x264_encoder_headers(x4->enc, &nal, &nnal);
+    // Assert for NAL start code and SPS unit type
+    av_assert0((nal->p_payload[0] | nal->p_payload[1] | nal->p_payload[2]) == 0 && nal->p_payload[3] == 1);
+    av_assert0((nal->p_payload[4] & 0x1F) == 7);
+    // bits 0-7 LSB for profile. bits 8-11 for constrained set flags.
+    if (avctx->profile == FF_PROFILE_UNKNOWN)
+        avctx->profile = ((uint32_t)nal->p_payload[5]) | ((uint32_t)ff_reverse[nal->p_payload[6]] << 8);
+    if (avctx->level == FF_LEVEL_UNKNOWN)
+        avctx->level = nal->p_payload[7];
 
-        s = x264_encoder_headers(x4->enc, &nal, &nnal);
+    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
         avctx->extradata = p = av_mallocz(s + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!p)
             return AVERROR(ENOMEM);