X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/d57e41130a416372145184a8a495ba225a2825d8..527bca3b84675fa91e8b42ccf9f2fc952c5a87d4:/examples/am7xxx-play.c diff --git a/examples/am7xxx-play.c b/examples/am7xxx-play.c index 91c7663..9deffd2 100644 --- a/examples/am7xxx-play.c +++ b/examples/am7xxx-play.c @@ -31,17 +31,11 @@ #include #include +#include #include #include -/* 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 { @@ -57,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(); @@ -105,40 +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 = -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; + input_codec_ctx = avcodec_alloc_context3(input_codec); if (input_codec_ctx == NULL) { - fprintf(stderr, "input codec context is not valid\n"); - ret = -ENOTSUP; + fprintf(stderr, "failed to allocate the input codec context\n"); + ret = -ENOMEM; goto cleanup; } - /* 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 = -ENOTSUP; - 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"); - ret = -ENOTSUP; - goto cleanup; + goto cleanup_ctx; } input_ctx->format_ctx = input_format_ctx; @@ -148,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: @@ -237,14 +225,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; } @@ -262,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; } @@ -326,9 +313,10 @@ static int am7xxx_play(const char *input_format_string, picture_scaled->height = (output_ctx.codec_ctx)->height; /* calculate the bytes needed for the output image and create buffer for the output image */ - out_buf_size = avpicture_get_size((output_ctx.codec_ctx)->pix_fmt, - (output_ctx.codec_ctx)->width, - (output_ctx.codec_ctx)->height); + out_buf_size = av_image_get_buffer_size((output_ctx.codec_ctx)->pix_fmt, + (output_ctx.codec_ctx)->width, + (output_ctx.codec_ctx)->height, + 1); out_buf = av_malloc(out_buf_size * sizeof(uint8_t)); if (out_buf == NULL) { fprintf(stderr, "cannot allocate output data buffer!\n"); @@ -337,11 +325,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, @@ -454,8 +444,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); @@ -467,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: