doc/examples/remuxing: switch to codecpar

Also limits remuxing to audio, video and subtitle streams.
This commit is contained in:
Matthieu Bouron 2017-03-28 11:57:26 +02:00
parent 7e3e0f87e6
commit 4a946aca7c
1 changed files with 35 additions and 7 deletions

View File

@ -50,6 +50,9 @@ int main(int argc, char **argv)
AVPacket pkt; AVPacket pkt;
const char *in_filename, *out_filename; const char *in_filename, *out_filename;
int ret, i; int ret, i;
int stream_index = 0;
int *stream_mapping = NULL;
int stream_mapping_size = 0;
if (argc < 3) { if (argc < 3) {
printf("usage: %s input output\n" printf("usage: %s input output\n"
@ -83,25 +86,42 @@ int main(int argc, char **argv)
goto end; 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; ofmt = ofmt_ctx->oformat;
for (i = 0; i < ifmt_ctx->nb_streams; i++) { for (i = 0; i < ifmt_ctx->nb_streams; i++) {
AVStream *out_stream;
AVStream *in_stream = ifmt_ctx->streams[i]; 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) { if (!out_stream) {
fprintf(stderr, "Failed allocating output stream\n"); fprintf(stderr, "Failed allocating output stream\n");
ret = AVERROR_UNKNOWN; ret = AVERROR_UNKNOWN;
goto end; goto end;
} }
ret = avcodec_copy_context(out_stream->codec, in_stream->codec); ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Failed to copy context from input to output stream codec context\n"); fprintf(stderr, "Failed to copy codec parameters\n");
goto end; goto end;
} }
out_stream->codec->codec_tag = 0; out_stream->codecpar->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); av_dump_format(ofmt_ctx, 0, out_filename, 1);
@ -127,8 +147,14 @@ int main(int argc, char **argv)
break; break;
in_stream = ifmt_ctx->streams[pkt.stream_index]; 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"); log_packet(ifmt_ctx, &pkt, "in");
/* copy packet */ /* copy packet */
@ -156,6 +182,8 @@ end:
avio_closep(&ofmt_ctx->pb); avio_closep(&ofmt_ctx->pb);
avformat_free_context(ofmt_ctx); avformat_free_context(ofmt_ctx);
av_freep(&stream_mapping);
if (ret < 0 && ret != AVERROR_EOF) { if (ret < 0 && ret != AVERROR_EOF) {
fprintf(stderr, "Error occurred: %s\n", av_err2str(ret)); fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
return 1; return 1;