[FFmpeg-devel] [PATCH] doc/examples/remuxing: switch to codecpar

Matthieu Bouron matthieu.bouron at gmail.com
Tue Mar 28 17:54:38 EEST 2017


On Tue, Mar 28, 2017 at 12:32 PM, Matthieu Bouron <matthieu.bouron at 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");
>              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
>
>
Patch pushed (taking into account wm4 and Moritz reviews).


More information about the ffmpeg-devel mailing list