static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
{
AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
- AVCodecContext *avctx = ost->enc_ctx;
+ AVCodecContext *avctx = ost->encoding_needed ? ost->enc_ctx : ost->st->codec;
int ret;
/*
decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
ret = poll_filters();
- if (ret < 0 && (ret != AVERROR_EOF && ret != AVERROR(EAGAIN)))
- av_log(NULL, AV_LOG_ERROR, "Error while filtering.\n");
+ if (ret < 0 && (ret != AVERROR_EOF && ret != AVERROR(EAGAIN))) {
+ char errbuf[128];
+ av_strerror(ret, errbuf, sizeof(errbuf));
+
+ av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", errbuf);
+ }
ist->resample_width = decoded_frame->width;
ist->resample_height = decoded_frame->height;
"%s hwaccel requested for input stream #%d:%d, "
"but cannot be initialized.\n", hwaccel->name,
ist->file_index, ist->st->index);
- exit_program(1);
+ return AV_PIX_FMT_NONE;
}
continue;
}
if (ost->attachment_filename)
continue;
- enc_ctx = ost->enc_ctx;
+ enc_ctx = ost->stream_copy ? ost->st->codec : ost->enc_ctx;
if (ist) {
dec_ctx = ist->dec_ctx;
if (ost->enc_ctx->bit_rate && ost->enc_ctx->bit_rate < 1000)
av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
"It takes bits/s as argument, not kbits/s\n");
+
+ ret = avcodec_copy_context(ost->st->codec, ost->enc_ctx);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_FATAL,
+ "Error initializing the output stream codec context.\n");
+ exit_program(1);
+ }
+
+ ost->st->time_base = ost->enc_ctx->time_base;
} else {
ret = av_opt_set_dict(ost->enc_ctx, &ost->encoder_opts);
if (ret < 0)
return ret;
+ ost->st->time_base = ost->st->codec->time_base;
}
-
- ret = avcodec_copy_context(ost->st->codec, ost->enc_ctx);
- if (ret < 0) {
- av_log(NULL, AV_LOG_FATAL,
- "Error initializing the output stream codec context.\n");
- exit_program(1);
- }
-
- ost->st->time_base = ost->enc_ctx->time_base;
}
/* init input streams */
const char *in_codec_name = "?";
const char *encoder_name = "?";
const char *out_codec_name = "?";
+ const AVCodecDescriptor *desc;
if (in_codec) {
decoder_name = in_codec->name;
- in_codec_name = avcodec_descriptor_get(in_codec->id)->name;
+ desc = avcodec_descriptor_get(in_codec->id);
+ if (desc)
+ in_codec_name = desc->name;
if (!strcmp(decoder_name, in_codec_name))
decoder_name = "native";
}
if (out_codec) {
encoder_name = out_codec->name;
- out_codec_name = avcodec_descriptor_get(out_codec->id)->name;
+ desc = avcodec_descriptor_get(out_codec->id);
+ if (desc)
+ out_codec_name = desc->name;
if (!strcmp(encoder_name, out_codec_name))
encoder_name = "native";
}
ret = poll_filters();
if (ret < 0) {
- if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
+ if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) {
continue;
+ } else {
+ char errbuf[128];
+ av_strerror(ret, errbuf, sizeof(errbuf));
- av_log(NULL, AV_LOG_ERROR, "Error while filtering.\n");
- break;
+ av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", errbuf);
+ break;
+ }
}
/* dump report by using the output first video and audio streams */