{
AVFrame *frame = ist->sub2video.frame;
int i;
+ int ret;
av_assert1(frame->data[0]);
ist->sub2video.last_pts = frame->pts = pts;
- for (i = 0; i < ist->nb_filters; i++)
- av_buffersrc_add_frame_flags(ist->filters[i]->filter, frame,
- AV_BUFFERSRC_FLAG_KEEP_REF |
- AV_BUFFERSRC_FLAG_PUSH);
+ for (i = 0; i < ist->nb_filters; i++) {
+ ret = av_buffersrc_add_frame_flags(ist->filters[i]->filter, frame,
+ AV_BUFFERSRC_FLAG_KEEP_REF |
+ AV_BUFFERSRC_FLAG_PUSH);
+ if (ret != AVERROR_EOF && ret < 0)
+ av_log(NULL, AV_LOG_WARNING, "Error while add the frame to buffer source(%s).\n",
+ av_err2str(ret));
+ }
}
void sub2video_update(InputStream *ist, AVSubtitle *sub)
static void sub2video_flush(InputStream *ist)
{
int i;
+ int ret;
if (ist->sub2video.end_pts < INT64_MAX)
sub2video_update(ist, NULL);
- for (i = 0; i < ist->nb_filters; i++)
- av_buffersrc_add_frame(ist->filters[i]->filter, NULL);
+ for (i = 0; i < ist->nb_filters; i++) {
+ ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL);
+ if (ret != AVERROR_EOF && ret < 0)
+ av_log(NULL, AV_LOG_WARNING, "Flush the frame error.\n");
+ }
}
/* end of sub2video hack */
static void
sigterm_handler(int sig)
{
+ int ret;
received_sigterm = sig;
received_nb_signals++;
term_exit_sigsafe();
if(received_nb_signals > 3) {
- write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n",
- strlen("Received > 3 system signals, hard exiting\n"));
-
+ ret = write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n",
+ strlen("Received > 3 system signals, hard exiting\n"));
+ if (ret < 0) { /* Do nothing */ };
exit(123);
}
}
InputFile *f = input_files [ist->file_index];
int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase);
- AVPacket opkt;
+ AVPacket opkt = { 0 };
+
+ av_init_packet(&opkt);
// EOF: flush output bitstream filters.
if (!pkt) {
return;
}
- av_init_packet(&opkt);
-
if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
!ost->copy_initial_nonkeyframes)
return;
}
/* handle stream copy */
- if (!ist->decoding_needed) {
+ if (!ist->decoding_needed && pkt) {
ist->dts = ist->next_dts;
switch (ist->dec_ctx->codec_type) {
case AVMEDIA_TYPE_AUDIO:
AVRational time_base_q = AV_TIME_BASE_Q;
int64_t next_dts = av_rescale_q(ist->next_dts, time_base_q, av_inv_q(ist->framerate));
ist->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
- } else if (pkt && pkt->duration) {
+ } else if (pkt->duration) {
ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
} else if(ist->dec_ctx->framerate.num != 0) {
int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict + 1 : ist->dec_ctx->ticks_per_frame;
av_freep(&avc);
}
-static const HWAccel *get_hwaccel(enum AVPixelFormat pix_fmt)
-{
- int i;
- for (i = 0; hwaccels[i].name; i++)
- if (hwaccels[i].pix_fmt == pix_fmt)
- return &hwaccels[i];
- return NULL;
-}
-
static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat *pix_fmts)
{
InputStream *ist = s->opaque;
const enum AVPixelFormat *p;
int ret;
- for (p = pix_fmts; *p != -1; p++) {
+ for (p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) {
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(*p);
- const HWAccel *hwaccel;
+ const AVCodecHWConfig *config = NULL;
+ int i;
if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
break;
- hwaccel = get_hwaccel(*p);
- if (!hwaccel ||
- (ist->active_hwaccel_id && ist->active_hwaccel_id != hwaccel->id) ||
- (ist->hwaccel_id != HWACCEL_AUTO && ist->hwaccel_id != hwaccel->id))
- continue;
+ if (ist->hwaccel_id == HWACCEL_GENERIC ||
+ ist->hwaccel_id == HWACCEL_AUTO) {
+ for (i = 0;; i++) {
+ config = avcodec_get_hw_config(s->codec, i);
+ if (!config)
+ break;
+ if (!(config->methods &
+ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX))
+ continue;
+ if (config->pix_fmt == *p)
+ break;
+ }
+ }
+ if (config) {
+ if (config->device_type != ist->hwaccel_device_type) {
+ // Different hwaccel offered, ignore.
+ continue;
+ }
- ret = hwaccel->init(s);
- if (ret < 0) {
- if (ist->hwaccel_id == hwaccel->id) {
+ ret = hwaccel_decode_init(s);
+ if (ret < 0) {
+ if (ist->hwaccel_id == HWACCEL_GENERIC) {
+ av_log(NULL, AV_LOG_FATAL,
+ "%s hwaccel requested for input stream #%d:%d, "
+ "but cannot be initialized.\n",
+ av_hwdevice_get_type_name(config->device_type),
+ ist->file_index, ist->st->index);
+ return AV_PIX_FMT_NONE;
+ }
+ continue;
+ }
+ } else {
+ const HWAccel *hwaccel = NULL;
+ int i;
+ for (i = 0; hwaccels[i].name; i++) {
+ if (hwaccels[i].pix_fmt == *p) {
+ hwaccel = &hwaccels[i];
+ break;
+ }
+ }
+ if (!hwaccel) {
+ // No hwaccel supporting this pixfmt.
+ continue;
+ }
+ if (hwaccel->id != ist->hwaccel_id) {
+ // Does not match requested hwaccel.
+ continue;
+ }
+
+ ret = hwaccel->init(s);
+ if (ret < 0) {
av_log(NULL, AV_LOG_FATAL,
"%s hwaccel requested for input stream #%d:%d, "
"but cannot be initialized.\n", hwaccel->name,
ist->file_index, ist->st->index);
return AV_PIX_FMT_NONE;
}
- continue;
}
if (ist->hw_frames_ctx) {
return AV_PIX_FMT_NONE;
}
- ist->active_hwaccel_id = hwaccel->id;
- ist->hwaccel_pix_fmt = *p;
+ ist->hwaccel_pix_fmt = *p;
break;
}
/* Useful for subtitles retiming by lavf (FIXME), skipping samples in
* audio, and video decoders such as cuvid or mediacodec */
- av_codec_set_pkt_timebase(ist->dec_ctx, ist->st->time_base);
+ ist->dec_ctx->pkt_timebase = ist->st->time_base;
if (!av_dict_get(ist->decoder_opts, "threads", NULL, 0))
av_dict_set(&ist->decoder_opts, "threads", "auto", 0);
AVRational sample_rate = {1, avctx->sample_rate};
duration = av_rescale_q(ist->nb_samples, sample_rate, ist->st->time_base);
- } else
+ } else {
continue;
+ }
} else {
if (ist->framerate.num) {
- duration = av_rescale_q(1, ist->framerate, ist->st->time_base);
+ duration = av_rescale_q(1, av_inv_q(ist->framerate), ist->st->time_base);
} else if (ist->st->avg_frame_rate.num) {
- duration = av_rescale_q(1, ist->st->avg_frame_rate, ist->st->time_base);
- } else duration = 1;
+ duration = av_rescale_q(1, av_inv_q(ist->st->avg_frame_rate), ist->st->time_base);
+ } else {
+ duration = 1;
+ }
}
if (!ifile->duration)
ifile->time_base = ist->st->time_base;
return ret;
}
if (ret < 0 && ifile->loop) {
- if ((ret = seek_to_start(ifile, is)) < 0)
- return ret;
- ret = get_input_packet(ifile, &pkt);
+ ret = seek_to_start(ifile, is);
+ if (ret < 0)
+ av_log(NULL, AV_LOG_WARNING, "Seek to start failed.\n");
+ else
+ ret = get_input_packet(ifile, &pkt);
if (ret == AVERROR(EAGAIN)) {
ifile->eagain = 1;
return ret;