fftools/ffmpeg: remove OutputStream.stream_copy

There are currently three possible modes for an output stream:
1) The stream is produced by encoding output from some filtergraph. This
   is true when ost->enc_ctx != NULL, or equivalently when
   ost->encoding_needed != 0.
2) The stream is produced by copying some input stream's packets. This
   is true when ost->enc_ctx == NULL && ost->source_index >= 0.
3) The stream is produced by attaching some file directly. This is true
   when ost->enc_ctx == NULL && ost->source_index < 0.

OutputStream.stream_copy is currently used to identify case 2), and
sometimes to confusingly (or even incorrectly) identify case 1). Remove
it, replacing its usage with checking enc_ctx/source_index values.
pull/388/head
Anton Khirnov 2 years ago
parent 4f2b946c19
commit 80e7feb48b
  1. 23
      fftools/ffmpeg.c
  2. 1
      fftools/ffmpeg.h
  3. 33
      fftools/ffmpeg_opt.c

@ -1566,9 +1566,7 @@ static void print_final_stats(int64_t total_size)
static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time) static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
{ {
AVBPrint buf, buf_script; AVBPrint buf, buf_script;
OutputStream *ost;
int64_t total_size = of_filesize(output_files[0]); int64_t total_size = of_filesize(output_files[0]);
AVCodecContext *enc;
int vid, i; int vid, i;
double bitrate; double bitrate;
double speed; double speed;
@ -1600,11 +1598,9 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC); av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC);
av_bprint_init(&buf_script, 0, AV_BPRINT_SIZE_AUTOMATIC); av_bprint_init(&buf_script, 0, AV_BPRINT_SIZE_AUTOMATIC);
for (i = 0; i < nb_output_streams; i++) { for (i = 0; i < nb_output_streams; i++) {
float q = -1; OutputStream * const ost = output_streams[i];
ost = output_streams[i]; const AVCodecContext * const enc = ost->enc_ctx;
enc = ost->enc_ctx; const float q = enc ? ost->quality / (float) FF_QP2LAMBDA : -1;
if (!ost->stream_copy)
q = ost->quality / (float) FF_QP2LAMBDA;
if (vid && ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (vid && ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
av_bprintf(&buf, "q=%2.1f ", q); av_bprintf(&buf, "q=%2.1f ", q);
@ -3258,7 +3254,7 @@ static int init_output_stream(OutputStream *ost, AVFrame *frame,
// copy estimated duration as a hint to the muxer // copy estimated duration as a hint to the muxer
if (ost->st->duration <= 0 && ist && ist->st->duration > 0) if (ost->st->duration <= 0 && ist && ist->st->duration > 0)
ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base); ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base);
} else if (ost->stream_copy) { } else if (ost->source_index >= 0) {
ret = init_output_stream_streamcopy(ost); ret = init_output_stream_streamcopy(ost);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -3343,7 +3339,7 @@ static int transcode_init(void)
* known after the encoder is initialized. * known after the encoder is initialized.
*/ */
for (i = 0; i < nb_output_streams; i++) { for (i = 0; i < nb_output_streams; i++) {
if (!output_streams[i]->stream_copy && if (output_streams[i]->enc_ctx &&
(output_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO || (output_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
output_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)) output_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))
continue; continue;
@ -3417,9 +3413,7 @@ static int transcode_init(void)
av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]", av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
ost->sync_ist->file_index, ost->sync_ist->file_index,
ost->sync_ist->st->index); ost->sync_ist->st->index);
if (ost->stream_copy) if (ost->enc_ctx) {
av_log(NULL, AV_LOG_INFO, " (copy)");
else {
const AVCodec *in_codec = input_streams[ost->source_index]->dec; const AVCodec *in_codec = input_streams[ost->source_index]->dec;
const AVCodec *out_codec = ost->enc; const AVCodec *out_codec = ost->enc;
const char *decoder_name = "?"; const char *decoder_name = "?";
@ -3449,7 +3443,8 @@ static int transcode_init(void)
av_log(NULL, AV_LOG_INFO, " (%s (%s) -> %s (%s))", av_log(NULL, AV_LOG_INFO, " (%s (%s) -> %s (%s))",
in_codec_name, decoder_name, in_codec_name, decoder_name,
out_codec_name, encoder_name); out_codec_name, encoder_name);
} } else
av_log(NULL, AV_LOG_INFO, " (copy)");
av_log(NULL, AV_LOG_INFO, "\n"); av_log(NULL, AV_LOG_INFO, "\n");
} }
@ -3959,7 +3954,7 @@ static int process_input(int file_index)
OutputStream *ost = output_streams[j]; OutputStream *ost = output_streams[j];
if (ost->source_index == ifile->ist_index + i && if (ost->source_index == ifile->ist_index + i &&
(ost->stream_copy || ost->enc->type == AVMEDIA_TYPE_SUBTITLE)) { (!ost->enc_ctx || ost->enc->type == AVMEDIA_TYPE_SUBTITLE)) {
OutputFile *of = output_files[ost->file_index]; OutputFile *of = output_files[ost->file_index];
output_packet(of, ost->pkt, ost, 1); output_packet(of, ost->pkt, ost, 1);
} }

@ -540,7 +540,6 @@ typedef struct OutputStream {
char *apad; char *apad;
OSTFinished finished; /* no more packets should be written for this stream */ OSTFinished finished; /* no more packets should be written for this stream */
int unavailable; /* true if the steram is unavailable (possibly temporarily) */ int unavailable; /* true if the steram is unavailable (possibly temporarily) */
int stream_copy;
// init_output_stream() has been called for this stream // init_output_stream() has been called for this stream
// The encoder and the bitstream filters have been initialized and the stream // The encoder and the bitstream filters have been initialized and the stream

@ -1555,16 +1555,13 @@ static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *o
avcodec_get_name(ost->st->codecpar->codec_id)); avcodec_get_name(ost->st->codecpar->codec_id));
return AVERROR_ENCODER_NOT_FOUND; return AVERROR_ENCODER_NOT_FOUND;
} }
} else if (!strcmp(codec_name, "copy")) } else if (strcmp(codec_name, "copy")) {
ost->stream_copy = 1;
else {
ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1); ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
ost->st->codecpar->codec_id = ost->enc->id; ost->st->codecpar->codec_id = ost->enc->id;
} }
ost->encoding_needed = !ost->stream_copy; ost->encoding_needed = !!ost->enc;
} else { } else {
/* no encoding supported for other media types */ /* no encoding supported for other media types */
ost->stream_copy = 1;
ost->encoding_needed = 0; ost->encoding_needed = 0;
} }
@ -1898,7 +1895,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st); MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st); MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
if (!ost->stream_copy) { if (ost->enc_ctx) {
AVCodecContext *video_enc = ost->enc_ctx; AVCodecContext *video_enc = ost->enc_ctx;
const char *p = NULL; const char *p = NULL;
char *frame_size = NULL; char *frame_size = NULL;
@ -2087,9 +2084,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
ost->last_frame = av_frame_alloc(); ost->last_frame = av_frame_alloc();
if (!ost->last_frame) if (!ost->last_frame)
exit_program(1); exit_program(1);
} } else
if (ost->stream_copy)
check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO); check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
return ost; return ost;
@ -2107,7 +2102,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in
MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st); MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st); MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
if (!ost->stream_copy) { if (ost->enc_ctx) {
AVCodecContext *audio_enc = ost->enc_ctx; AVCodecContext *audio_enc = ost->enc_ctx;
int channels = 0; int channels = 0;
char *layout = NULL; char *layout = NULL;
@ -2186,9 +2181,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in
} }
} }
#endif #endif
} } else
if (ost->stream_copy)
check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO); check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
return ost; return ost;
@ -2199,7 +2192,7 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int
OutputStream *ost; OutputStream *ost;
ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index); ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
if (!ost->stream_copy) { if (ost->enc_ctx) {
av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n"); av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
exit_program(1); exit_program(1);
} }
@ -2212,7 +2205,7 @@ static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc,
OutputStream *ost; OutputStream *ost;
ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index); ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
if (!ost->stream_copy) { if (ost->enc_ctx) {
av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n"); av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
exit_program(1); exit_program(1);
} }
@ -2223,7 +2216,6 @@ static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc,
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index) static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
{ {
OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index); OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
ost->stream_copy = 1;
ost->finished = 1; ost->finished = 1;
return ost; return ost;
} }
@ -2236,7 +2228,7 @@ static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc,
ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index); ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
st = ost->st; st = ost->st;
if (!ost->stream_copy) { if (ost->enc_ctx) {
AVCodecContext *subtitle_enc = ost->enc_ctx; AVCodecContext *subtitle_enc = ost->enc_ctx;
char *frame_size = NULL; char *frame_size = NULL;
@ -2401,7 +2393,7 @@ static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
ofilter->ost = ost; ofilter->ost = ost;
ofilter->format = -1; ofilter->format = -1;
if (ost->stream_copy) { if (!ost->enc_ctx) {
av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, " av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
"which is fed from a complex filtergraph. Filtering and streamcopy " "which is fed from a complex filtergraph. Filtering and streamcopy "
"cannot be used together.\n", ost->file_index, ost->index); "cannot be used together.\n", ost->file_index, ost->index);
@ -2768,7 +2760,6 @@ static void of_add_attachments(AVFormatContext *oc, OptionsContext *o)
memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE); memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
ost = new_attachment_stream(o, oc, -1); ost = new_attachment_stream(o, oc, -1);
ost->stream_copy = 0;
ost->attachment_filename = o->attachments[i]; ost->attachment_filename = o->attachments[i];
ost->st->codecpar->extradata = attachment; ost->st->codecpar->extradata = attachment;
ost->st->codecpar->extradata_size = len; ost->st->codecpar->extradata_size = len;
@ -3068,7 +3059,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
exit_program(1); exit_program(1);
} }
} }
} else if (ost->stream_copy && ost->source_index >= 0) { } else if (ost->source_index >= 0) {
InputStream *ist = input_streams[ost->source_index]; InputStream *ist = input_streams[ost->source_index];
ist->processing_needed = 1; ist->processing_needed = 1;
} }
@ -3193,7 +3184,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
continue; continue;
ist = input_streams[output_streams[i]->source_index]; ist = input_streams[output_streams[i]->source_index];
av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE); av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
if (!output_streams[i]->stream_copy) { if (output_streams[i]->enc_ctx) {
av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0); av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
} }
} }

Loading…
Cancel
Save