Message ID | 1513248854-28686-1-git-send-email-vdixit@akamai.com |
---|---|
State | Superseded |
Headers | show |
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 --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);
From: Vishwanath Dixit <vdixit@akamai.com> --- libavcodec/libx264.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)