| 1986 | } |
| 1987 | |
| 1988 | static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt) |
| 1989 | { |
| 1990 | OutputFile *of = output_files[ost->file_index]; |
| 1991 | InputFile *f = input_files [ist->file_index]; |
| 1992 | int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time; |
| 1993 | int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase); |
| 1994 | AVPicture pict; |
| 1995 | AVPacket opkt; |
| 1996 | |
| 1997 | av_init_packet(&opkt); |
| 1998 | |
| 1999 | if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && |
| 2000 | !ost->copy_initial_nonkeyframes) |
| 2001 | return; |
| 2002 | |
| 2003 | if (!ost->frame_number && !ost->copy_prior_start) { |
| 2004 | int64_t comp_start = start_time; |
| 2005 | if (copy_ts && f->start_time != AV_NOPTS_VALUE) |
| 2006 | comp_start = FFMAX(start_time, f->start_time + f->ts_offset); |
| 2007 | if (pkt->pts == AV_NOPTS_VALUE ? |
| 2008 | ist->pts < comp_start : |
| 2009 | pkt->pts < av_rescale_q(comp_start, AV_TIME_BASE_Q, ist->st->time_base)) |
| 2010 | return; |
| 2011 | } |
| 2012 | |
| 2013 | if (of->recording_time != INT64_MAX && |
| 2014 | ist->pts >= of->recording_time + start_time) { |
| 2015 | close_output_stream(ost); |
| 2016 | return; |
| 2017 | } |
| 2018 | |
| 2019 | if (f->recording_time != INT64_MAX) { |
| 2020 | start_time = f->ctx->start_time; |
| 2021 | if (f->start_time != AV_NOPTS_VALUE && copy_ts) |
| 2022 | start_time += f->start_time; |
| 2023 | if (ist->pts >= f->recording_time + start_time) { |
| 2024 | close_output_stream(ost); |
| 2025 | return; |
| 2026 | } |
| 2027 | } |
| 2028 | |
| 2029 | /* force the input stream PTS */ |
| 2030 | if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) |
| 2031 | ost->sync_opts++; |
| 2032 | |
| 2033 | if (pkt->pts != AV_NOPTS_VALUE) |
| 2034 | opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time; |
| 2035 | else |
| 2036 | opkt.pts = AV_NOPTS_VALUE; |
| 2037 | |
| 2038 | if (pkt->dts == AV_NOPTS_VALUE) |
| 2039 | opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase); |
| 2040 | else |
| 2041 | opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase); |
| 2042 | opkt.dts -= ost_tb_start_time; |
| 2043 | |
| 2044 | if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) { |
| 2045 | int duration = av_get_audio_frame_duration(ist->dec_ctx, pkt->size); |
no test coverage detected