context->color_trc = job->color_transfer;
context->colorspace = job->color_matrix;
- if( job->mux & HB_MUX_MASK_MP4 )
- {
- context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
- }
+ context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
if( job->grayscale )
{
context->flags |= AV_CODEC_FLAG_GRAY;
job->areBframes = 1;
}
- if( ( job->mux & HB_MUX_MASK_MP4 ) && job->pass_id != HB_PASS_ENCODE_1ST )
+ if (context->extradata != NULL)
{
- if (w->codec_param == AV_CODEC_ID_H264) // FIXME: h265 as well?
- {
- // Scan extradata for the SPS/PPS headers
- unsigned char *data = context->extradata;
- unsigned char *dataEnd = context->extradata + context->extradata_size;
- size_t len = dataEnd - data;
-
- while ((data = hb_annexb_find_next_nalu(data, &len)) != NULL) {
- if ((data[0] & 0x1f) == 7) {
- // SPS found, copy into work object
- w->config->h264.sps_length = len;
- memcpy(w->config->h264.sps, data, len);
- }
- if ((data[0] & 0x1f) == 8) {
- // PPS found, copy into work object
- w->config->h264.pps_length = len;
- memcpy(w->config->h264.pps, data, len);
- }
- len = dataEnd - data;
- }
- }
- else
- {
- w->config->mpeg4.length = context->extradata_size;
- memcpy( w->config->mpeg4.bytes, context->extradata,
- context->extradata_size );
- }
+ memcpy(w->config->extradata.bytes, context->extradata,
+ context->extradata_size);
+ w->config->extradata.length = context->extradata_size;
}
done:
case HB_VCODEC_X264_8BIT:
case HB_VCODEC_X264_10BIT:
case HB_VCODEC_QSV_H264:
- case HB_VCODEC_FFMPEG_VCE_H264:
- case HB_VCODEC_FFMPEG_NVENC_H264:
track->st->codecpar->codec_id = AV_CODEC_ID_H264;
if (job->mux == HB_MUX_AV_MP4 && job->inline_parameter_sets)
{
job->config.h264.pps, job->config.h264.pps_length );
break;
+ case HB_VCODEC_FFMPEG_VCE_H264:
+ case HB_VCODEC_FFMPEG_NVENC_H264:
+ track->st->codecpar->codec_id = AV_CODEC_ID_H264;
+ if (job->mux == HB_MUX_AV_MP4 && job->inline_parameter_sets)
+ {
+ track->st->codecpar->codec_tag = MKTAG('a','v','c','3');
+ }
+ else
+ {
+ track->st->codecpar->codec_tag = MKTAG('a','v','c','1');
+ }
+ if (job->config.extradata.length > 0)
+ {
+ priv_size = job->config.extradata.length;
+ priv_data = av_malloc(priv_size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (priv_data == NULL)
+ {
+ hb_error("h.265 extradata: malloc failure");
+ goto error;
+ }
+ memcpy(priv_data,
+ job->config.extradata.bytes,
+ job->config.extradata.length);
+ }
+ break;
+
case HB_VCODEC_FFMPEG_MPEG4:
track->st->codecpar->codec_id = AV_CODEC_ID_MPEG4;
- if (job->config.mpeg4.length != 0)
+ if (job->config.extradata.length > 0)
{
- priv_size = job->config.mpeg4.length;
+ priv_size = job->config.extradata.length;
priv_data = av_malloc(priv_size + AV_INPUT_BUFFER_PADDING_SIZE);
if (priv_data == NULL)
{
- hb_error("MPEG4 extradata: malloc failure");
+ hb_error("h.265 extradata: malloc failure");
goto error;
}
- memcpy(priv_data, job->config.mpeg4.bytes, priv_size);
+ memcpy(priv_data,
+ job->config.extradata.bytes,
+ job->config.extradata.length);
}
break;
case HB_VCODEC_FFMPEG_MPEG2:
track->st->codecpar->codec_id = AV_CODEC_ID_MPEG2VIDEO;
- if (job->config.mpeg4.length != 0)
+ if (job->config.extradata.length > 0)
{
- priv_size = job->config.mpeg4.length;
+ priv_size = job->config.extradata.length;
priv_data = av_malloc(priv_size + AV_INPUT_BUFFER_PADDING_SIZE);
if (priv_data == NULL)
{
- hb_error("MPEG2 extradata: malloc failure");
+ hb_error("h.265 extradata: malloc failure");
goto error;
}
- memcpy(priv_data, job->config.mpeg4.bytes, priv_size);
+ memcpy(priv_data,
+ job->config.extradata.bytes,
+ job->config.extradata.length);
}
break;
case HB_VCODEC_X265_16BIT:
case HB_VCODEC_QSV_H265:
case HB_VCODEC_QSV_H265_10BIT:
- case HB_VCODEC_FFMPEG_VCE_H265:
- case HB_VCODEC_FFMPEG_NVENC_H265:
track->st->codecpar->codec_id = AV_CODEC_ID_HEVC;
if (job->mux == HB_MUX_AV_MP4 && job->inline_parameter_sets)
{
}
break;
+ case HB_VCODEC_FFMPEG_VCE_H265:
+ case HB_VCODEC_FFMPEG_NVENC_H265:
+ track->st->codecpar->codec_id = AV_CODEC_ID_HEVC;
+ if (job->mux == HB_MUX_AV_MP4 && job->inline_parameter_sets)
+ {
+ track->st->codecpar->codec_tag = MKTAG('h','e','v','1');
+ }
+ else
+ {
+ track->st->codecpar->codec_tag = MKTAG('h','v','c','1');
+ }
+ if (job->config.extradata.length > 0)
+ {
+ priv_size = job->config.extradata.length;
+ priv_data = av_malloc(priv_size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (priv_data == NULL)
+ {
+ hb_error("h.265 extradata: malloc failure");
+ goto error;
+ }
+ memcpy(priv_data,
+ job->config.extradata.bytes,
+ job->config.extradata.length);
+ }
+ break;
+
default:
hb_error("muxavformat: Unknown video codec: %x", job->vcodec);
goto error;