[FFmpeg-devel] [PATCH] doc/examples/remuxing: switch to codecpar
Matthieu Bouron
matthieu.bouron at gmail.com
Tue Mar 28 13:32:19 EEST 2017
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");
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;
--
2.12.0
More information about the ffmpeg-devel
mailing list