X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/336853d1eb2a1cb84b7995e579c320f754519602..7193dbf2d47df0d9e317d41543292004940cc047:/examples/am7xxx-play.c diff --git a/examples/am7xxx-play.c b/examples/am7xxx-play.c index 6b0d206..b4356ea 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 { @@ -113,23 +107,18 @@ static int video_input_init(struct video_input_ctx *input_ctx, } 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; - } /* 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; + ret = -EINVAL; goto cleanup; } @@ -137,7 +126,6 @@ static int video_input_init(struct video_input_ctx *input_ctx, ret = avcodec_open2(input_codec_ctx, input_codec, NULL); if (ret < 0) { fprintf(stderr, "cannot open input codec\n"); - ret = -ENOTSUP; goto cleanup; } @@ -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; } @@ -326,9 +314,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 +326,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, @@ -388,7 +379,11 @@ static int am7xxx_play(const char *input_format_string, /* if we got the complete frame */ if (got_picture) { - /* convert it to YUV */ + /* + * Rescaling the picture also changes its pixel format + * to the raw format supported by the projector if + * this was set in video_output_init() + */ sws_scale(sw_scale_ctx, (const uint8_t * const *)picture_raw->data, picture_raw->linesize, @@ -450,8 +445,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); @@ -548,7 +543,7 @@ static char *get_x_screen_size(const char *input_path) static char *get_x_screen_size(const char *input_path) { (void) input_path; - fprintf(stderr, "%s: fallback implementation\n", __func__); + fprintf(stderr, "%s: fallback implementation, assuming a vga screen\n", __func__); return strdup("vga"); } #endif