On Tue, 28 Mar 2017 12:32:19 +0200 Matthieu Bouron <matthieu.bou...@gmail.com> wrote:
> Also limits remuxing to audio, video and subtitle streams. > --- > doc/examples/remuxing.c | 48 +++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 41 insertions(+), 7 deletions(-) > > diff --git a/doc/examples/remuxing.c b/doc/examples/remuxing.c > index 65437d9abd..8615c73842 100644 > --- a/doc/examples/remuxing.c > +++ b/doc/examples/remuxing.c > @@ -50,6 +50,9 @@ int main(int argc, char **argv) > AVPacket pkt; > const char *in_filename, *out_filename; > int ret, i; > + int stream_index = 0; > + int *stream_mapping = NULL; > + int stream_mapping_size = 0; > > if (argc < 3) { > printf("usage: %s input output\n" > @@ -83,25 +86,48 @@ int main(int argc, char **argv) > goto end; > } > > + stream_mapping_size = ifmt_ctx->nb_streams; > + stream_mapping = av_mallocz_array(stream_mapping_size, > sizeof(*stream_mapping)); > + if (!stream_mapping) { > + ret = AVERROR(ENOMEM); > + goto end; > + } > + > ofmt = ofmt_ctx->oformat; > > for (i = 0; i < ifmt_ctx->nb_streams; i++) { > + AVStream *out_stream; > AVStream *in_stream = ifmt_ctx->streams[i]; > - AVStream *out_stream = avformat_new_stream(ofmt_ctx, > in_stream->codec->codec); > + AVCodecParameters *in_codecpar = in_stream->codecpar; > + > + if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO && > + in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO && > + in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) { > + stream_mapping[i] = -1; > + continue; > + } > + > + stream_mapping[i] = stream_index++; > + > + out_stream = avformat_new_stream(ofmt_ctx, NULL); > if (!out_stream) { > fprintf(stderr, "Failed allocating output stream\n"); > ret = AVERROR_UNKNOWN; > goto end; > } > > - ret = avcodec_copy_context(out_stream->codec, in_stream->codec); > + ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar); > if (ret < 0) { > - fprintf(stderr, "Failed to copy context from input to output > stream codec context\n"); > + fprintf(stderr, "Failed to copy copy codec parameters\n"); > + goto end; > + } > + out_stream->codecpar->codec_tag = 0; > + > + ret = avformat_transfer_internal_stream_timing_info(ofmt, > out_stream, in_stream, AVFMT_TBCF_AUTO); > + if (ret < 0) { > + fprintf(stderr, "Failed to copy stream timing info\n"); Remove this call. It was made for obscure corner cases like ffserver, and one avi thing AFAIK? > goto end; > } > - out_stream->codec->codec_tag = 0; > - if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) > - out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; > } > av_dump_format(ofmt_ctx, 0, out_filename, 1); > > @@ -127,8 +153,14 @@ int main(int argc, char **argv) > break; > > in_stream = ifmt_ctx->streams[pkt.stream_index]; > - out_stream = ofmt_ctx->streams[pkt.stream_index]; > + if (pkt.stream_index >= stream_mapping_size || > + stream_mapping[pkt.stream_index] < 0) { > + av_packet_unref(&pkt); > + continue; > + } > > + pkt.stream_index = stream_mapping[pkt.stream_index]; > + out_stream = ofmt_ctx->streams[pkt.stream_index]; > log_packet(ifmt_ctx, &pkt, "in"); > > /* copy packet */ > @@ -156,6 +188,8 @@ end: > avio_closep(&ofmt_ctx->pb); > avformat_free_context(ofmt_ctx); > > + av_freep(&stream_mapping); > + > if (ret < 0 && ret != AVERROR_EOF) { > fprintf(stderr, "Error occurred: %s\n", av_err2str(ret)); > return 1; _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel