am7xxx-play: use av_find_best_stream() instead of open-coding the search
[libam7xxx.git] / examples / am7xxx-play.c
index b4356ea..9deffd2 100644 (file)
@@ -51,10 +51,10 @@ static int video_input_init(struct video_input_ctx *input_ctx,
 {
        AVInputFormat *input_format = NULL;
        AVFormatContext *input_format_ctx;
+       AVCodecParameters *input_codec_params;
        AVCodecContext *input_codec_ctx;
        AVCodec *input_codec;
        int video_index;
-       unsigned int i;
        int ret;
 
        avdevice_register_all();
@@ -99,34 +99,32 @@ static int video_input_init(struct video_input_ctx *input_ctx,
        av_dump_format(input_format_ctx, 0, input_path, 0);
 
        /* look for the first video_stream */
-       video_index = -1;
-       for (i = 0; i < input_format_ctx->nb_streams; i++)
-               if (input_format_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
-                       video_index = i;
-                       break;
-               }
-       if (video_index == -1) {
+       video_index = av_find_best_stream(input_format_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &input_codec, 0);
+       if (video_index < 0) {
                fprintf(stderr, "cannot find any video streams\n");
                ret = -EINVAL;
                goto cleanup;
        }
 
-       /* get a pointer to the codec context for the video stream */
-       input_codec_ctx = input_format_ctx->streams[video_index]->codec;
-
-       /* find the decoder for the video stream */
-       input_codec = avcodec_find_decoder(input_codec_ctx->codec_id);
-       if (input_codec == NULL) {
-               fprintf(stderr, "input_codec is NULL!\n");
-               ret = -EINVAL;
+       input_codec_ctx = avcodec_alloc_context3(input_codec);
+       if (input_codec_ctx == NULL) {
+               fprintf(stderr, "failed to allocate the input codec context\n");
+               ret = -ENOMEM;
                goto cleanup;
        }
 
+       input_codec_params = input_format_ctx->streams[video_index]->codecpar;
+       ret = avcodec_parameters_to_context(input_codec_ctx, input_codec_params);
+       if (ret < 0) {
+               fprintf(stderr, "cannot copy parameters to input codec context\n");
+               goto cleanup_ctx;
+       }
+
        /* open the decoder */
        ret = avcodec_open2(input_codec_ctx, input_codec, NULL);
        if (ret < 0) {
                fprintf(stderr, "cannot open input codec\n");
-               goto cleanup;
+               goto cleanup_ctx;
        }
 
        input_ctx->format_ctx = input_format_ctx;
@@ -136,6 +134,8 @@ static int video_input_init(struct video_input_ctx *input_ctx,
        ret = 0;
        goto out;
 
+cleanup_ctx:
+       avcodec_free_context(&input_codec_ctx);
 cleanup:
        avformat_close_input(&input_format_ctx);
 out:
@@ -250,8 +250,7 @@ static int video_output_init(struct video_output_ctx *output_ctx,
        goto out;
 
 cleanup:
-       avcodec_close(output_codec_ctx);
-       av_free(output_codec_ctx);
+       avcodec_free_context(&output_codec_ctx);
 out:
        return ret;
 }
@@ -458,14 +457,15 @@ cleanup_picture_raw:
        av_frame_free(&picture_raw);
 
 cleanup_output:
-       /* av_free is needed as well,
-        * see http://libav.org/doxygen/master/avcodec_8h.html#a5d7440cd7ea195bd0b14f21a00ef36dd
+       /* Freeing the codec context is needed as well,
+        * see https://libav.org/documentation/doxygen/master/group__lavc__core.html#gaf4daa92361efb3523ef5afeb0b54077f
         */
        avcodec_close(output_ctx.codec_ctx);
-       av_free(output_ctx.codec_ctx);
+       avcodec_free_context(&(output_ctx.codec_ctx));
 
 cleanup_input:
        avcodec_close(input_ctx.codec_ctx);
+       avcodec_free_context(&(input_ctx.codec_ctx));
        avformat_close_input(&(input_ctx.format_ctx));
 
 out: