am7xxx-play: use AVStream.codecpar instead of the deprecated AVStream.codec
[libam7xxx.git] / examples / am7xxx-play.c
index f5e6157..b523ca6 100644 (file)
 
 #include <am7xxx.h>
 
-/* On some systems ENOTSUP is not defined, fallback to its value on
- * linux which is equal to EOPNOTSUPP which is 95
- */
-#ifndef ENOTSUP
-#define ENOTSUP 95
-#endif
-
 static unsigned int run = 1;
 
 struct video_input_ctx {
@@ -58,6 +51,7 @@ 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;
@@ -108,38 +102,45 @@ static int video_input_init(struct video_input_ctx *input_ctx,
        /* 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) {
+               if (input_format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
                        video_index = i;
                        break;
                }
        if (video_index == -1) {
                fprintf(stderr, "cannot find any video streams\n");
-               ret = -ENOTSUP;
+               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;
-       if (input_codec_ctx == NULL) {
-               fprintf(stderr, "input codec context is not valid\n");
-               ret = -ENOTSUP;
-               goto cleanup;
-       }
+       /* get a pointer to the codec parameters for the video stream */
+       input_codec_params = input_format_ctx->streams[video_index]->codecpar;
 
        /* find the decoder for the video stream */
-       input_codec = avcodec_find_decoder(input_codec_ctx->codec_id);
+       input_codec = avcodec_find_decoder(input_codec_params->codec_id);
        if (input_codec == NULL) {
                fprintf(stderr, "input_codec is NULL!\n");
-               ret = -ENOTSUP;
+               ret = -EINVAL;
+               goto cleanup;
+       }
+
+       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;
        }
 
+       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");
-               ret = -ENOTSUP;
-               goto cleanup;
+               goto cleanup_ctx;
        }
 
        input_ctx->format_ctx = input_format_ctx;
@@ -149,6 +150,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:
@@ -238,14 +241,14 @@ static int video_output_init(struct video_output_ctx *output_ctx,
        output_codec_ctx->qmin       = output_codec_ctx->qmax = ((100 - (quality - 1)) * FF_QUALITY_SCALE) / 100;
        output_codec_ctx->mb_lmin    = output_codec_ctx->qmin * FF_QP2LAMBDA;
        output_codec_ctx->mb_lmax    = output_codec_ctx->qmax * FF_QP2LAMBDA;
-       output_codec_ctx->flags      |= CODEC_FLAG_QSCALE;
+       output_codec_ctx->flags      |= AV_CODEC_FLAG_QSCALE;
        output_codec_ctx->global_quality = output_codec_ctx->qmin * FF_QP2LAMBDA;
 
        /* find the encoder */
        output_codec = avcodec_find_encoder(output_codec_ctx->codec_id);
        if (output_codec == NULL) {
                fprintf(stderr, "cannot find output codec!\n");
-               ret = -ENOTSUP;
+               ret = -EINVAL;
                goto cleanup;
        }
 
@@ -339,11 +342,13 @@ static int am7xxx_play(const char *input_format_string,
        }
 
        /* assign appropriate parts of buffer to image planes in picture_scaled */
-       avpicture_fill((AVPicture *)picture_scaled,
-                      out_buf,
-                      (output_ctx.codec_ctx)->pix_fmt,
-                      (output_ctx.codec_ctx)->width,
-                      (output_ctx.codec_ctx)->height);
+       av_image_fill_arrays(picture_scaled->data,
+                            picture_scaled->linesize,
+                            out_buf,
+                            (output_ctx.codec_ctx)->pix_fmt,
+                            (output_ctx.codec_ctx)->width,
+                            (output_ctx.codec_ctx)->height,
+                            1);
 
        sw_scale_ctx = sws_getCachedContext(NULL,
                                            (input_ctx.codec_ctx)->width,
@@ -456,8 +461,8 @@ static int am7xxx_play(const char *input_format_string,
                }
 end_while:
                if (!output_ctx.raw_output && got_packet)
-                       av_free_packet(&out_packet);
-               av_free_packet(&in_packet);
+                       av_packet_unref(&out_packet);
+               av_packet_unref(&in_packet);
        }
 
        sws_freeContext(sw_scale_ctx);
@@ -477,6 +482,7 @@ cleanup_output:
 
 cleanup_input:
        avcodec_close(input_ctx.codec_ctx);
+       avcodec_free_context(&(input_ctx.codec_ctx));
        avformat_close_input(&(input_ctx.format_ctx));
 
 out: