|
|
|
@ -1674,7 +1674,7 @@ static int transcode_init(void) |
|
|
|
|
|
|
|
|
|
/* for each output stream, we compute the right encoding parameters */ |
|
|
|
|
for (i = 0; i < nb_output_streams; i++) { |
|
|
|
|
AVCodecContext *icodec = NULL; |
|
|
|
|
AVCodecContext *dec_ctx = NULL; |
|
|
|
|
ost = output_streams[i]; |
|
|
|
|
oc = output_files[ost->file_index]->ctx; |
|
|
|
|
ist = get_input_stream(ost); |
|
|
|
@ -1685,11 +1685,11 @@ static int transcode_init(void) |
|
|
|
|
codec = ost->st->codec; |
|
|
|
|
|
|
|
|
|
if (ist) { |
|
|
|
|
icodec = ist->st->codec; |
|
|
|
|
dec_ctx = ist->st->codec; |
|
|
|
|
|
|
|
|
|
ost->st->disposition = ist->st->disposition; |
|
|
|
|
codec->bits_per_raw_sample = icodec->bits_per_raw_sample; |
|
|
|
|
codec->chroma_sample_location = icodec->chroma_sample_location; |
|
|
|
|
codec->bits_per_raw_sample = dec_ctx->bits_per_raw_sample; |
|
|
|
|
codec->chroma_sample_location = dec_ctx->chroma_sample_location; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (ost->stream_copy) { |
|
|
|
@ -1698,36 +1698,36 @@ static int transcode_init(void) |
|
|
|
|
|
|
|
|
|
av_assert0(ist && !ost->filter); |
|
|
|
|
|
|
|
|
|
extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE; |
|
|
|
|
extra_size = (uint64_t)dec_ctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE; |
|
|
|
|
|
|
|
|
|
if (extra_size > INT_MAX) { |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* if stream_copy is selected, no need to decode or encode */ |
|
|
|
|
codec->codec_id = icodec->codec_id; |
|
|
|
|
codec->codec_type = icodec->codec_type; |
|
|
|
|
codec->codec_id = dec_ctx->codec_id; |
|
|
|
|
codec->codec_type = dec_ctx->codec_type; |
|
|
|
|
|
|
|
|
|
if (!codec->codec_tag) { |
|
|
|
|
if (!oc->oformat->codec_tag || |
|
|
|
|
av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id || |
|
|
|
|
av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0) |
|
|
|
|
codec->codec_tag = icodec->codec_tag; |
|
|
|
|
av_codec_get_id (oc->oformat->codec_tag, dec_ctx->codec_tag) == codec->codec_id || |
|
|
|
|
av_codec_get_tag(oc->oformat->codec_tag, dec_ctx->codec_id) <= 0) |
|
|
|
|
codec->codec_tag = dec_ctx->codec_tag; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
codec->bit_rate = icodec->bit_rate; |
|
|
|
|
codec->rc_max_rate = icodec->rc_max_rate; |
|
|
|
|
codec->rc_buffer_size = icodec->rc_buffer_size; |
|
|
|
|
codec->field_order = icodec->field_order; |
|
|
|
|
codec->bit_rate = dec_ctx->bit_rate; |
|
|
|
|
codec->rc_max_rate = dec_ctx->rc_max_rate; |
|
|
|
|
codec->rc_buffer_size = dec_ctx->rc_buffer_size; |
|
|
|
|
codec->field_order = dec_ctx->field_order; |
|
|
|
|
codec->extradata = av_mallocz(extra_size); |
|
|
|
|
if (!codec->extradata) { |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
memcpy(codec->extradata, icodec->extradata, icodec->extradata_size); |
|
|
|
|
codec->extradata_size = icodec->extradata_size; |
|
|
|
|
memcpy(codec->extradata, dec_ctx->extradata, dec_ctx->extradata_size); |
|
|
|
|
codec->extradata_size = dec_ctx->extradata_size; |
|
|
|
|
if (!copy_tb) { |
|
|
|
|
codec->time_base = icodec->time_base; |
|
|
|
|
codec->time_base.num *= icodec->ticks_per_frame; |
|
|
|
|
codec->time_base = dec_ctx->time_base; |
|
|
|
|
codec->time_base.num *= dec_ctx->ticks_per_frame; |
|
|
|
|
av_reduce(&codec->time_base.num, &codec->time_base.den, |
|
|
|
|
codec->time_base.num, codec->time_base.den, INT_MAX); |
|
|
|
|
} else |
|
|
|
@ -1741,29 +1741,29 @@ static int transcode_init(void) |
|
|
|
|
av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n"); |
|
|
|
|
exit_program(1); |
|
|
|
|
} |
|
|
|
|
codec->channel_layout = icodec->channel_layout; |
|
|
|
|
codec->sample_rate = icodec->sample_rate; |
|
|
|
|
codec->channels = icodec->channels; |
|
|
|
|
codec->frame_size = icodec->frame_size; |
|
|
|
|
codec->audio_service_type = icodec->audio_service_type; |
|
|
|
|
codec->block_align = icodec->block_align; |
|
|
|
|
codec->channel_layout = dec_ctx->channel_layout; |
|
|
|
|
codec->sample_rate = dec_ctx->sample_rate; |
|
|
|
|
codec->channels = dec_ctx->channels; |
|
|
|
|
codec->frame_size = dec_ctx->frame_size; |
|
|
|
|
codec->audio_service_type = dec_ctx->audio_service_type; |
|
|
|
|
codec->block_align = dec_ctx->block_align; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
codec->pix_fmt = icodec->pix_fmt; |
|
|
|
|
codec->width = icodec->width; |
|
|
|
|
codec->height = icodec->height; |
|
|
|
|
codec->has_b_frames = icodec->has_b_frames; |
|
|
|
|
codec->pix_fmt = dec_ctx->pix_fmt; |
|
|
|
|
codec->width = dec_ctx->width; |
|
|
|
|
codec->height = dec_ctx->height; |
|
|
|
|
codec->has_b_frames = dec_ctx->has_b_frames; |
|
|
|
|
if (ost->frame_aspect_ratio) |
|
|
|
|
sar = av_d2q(ost->frame_aspect_ratio * codec->height / codec->width, 255); |
|
|
|
|
else if (ist->st->sample_aspect_ratio.num) |
|
|
|
|
sar = ist->st->sample_aspect_ratio; |
|
|
|
|
else |
|
|
|
|
sar = icodec->sample_aspect_ratio; |
|
|
|
|
sar = dec_ctx->sample_aspect_ratio; |
|
|
|
|
ost->st->sample_aspect_ratio = codec->sample_aspect_ratio = sar; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_SUBTITLE: |
|
|
|
|
codec->width = icodec->width; |
|
|
|
|
codec->height = icodec->height; |
|
|
|
|
codec->width = dec_ctx->width; |
|
|
|
|
codec->height = dec_ctx->height; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_DATA: |
|
|
|
|
case AVMEDIA_TYPE_ATTACHMENT: |
|
|
|
@ -1851,10 +1851,10 @@ static int transcode_init(void) |
|
|
|
|
ost->filter->filter->inputs[0]->sample_aspect_ratio; |
|
|
|
|
codec->pix_fmt = ost->filter->filter->inputs[0]->format; |
|
|
|
|
|
|
|
|
|
if (icodec && |
|
|
|
|
(codec->width != icodec->width || |
|
|
|
|
codec->height != icodec->height || |
|
|
|
|
codec->pix_fmt != icodec->pix_fmt)) { |
|
|
|
|
if (dec_ctx && |
|
|
|
|
(codec->width != dec_ctx->width || |
|
|
|
|
codec->height != dec_ctx->height || |
|
|
|
|
codec->pix_fmt != dec_ctx->pix_fmt)) { |
|
|
|
|
codec->bits_per_raw_sample = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|