#include <libavdevice/avdevice.h>
#include <libavformat/avformat.h>
+#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
#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 {
}
if (video_index == -1) {
fprintf(stderr, "cannot find any video streams\n");
- ret = -ENOTSUP;
+ ret = -EINVAL;
goto cleanup;
}
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;
+ ret = -EINVAL;
goto cleanup;
}
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;
}
ret = avcodec_open2(input_codec_ctx, input_codec, NULL);
if (ret < 0) {
fprintf(stderr, "cannot open input codec\n");
- ret = -ENOTSUP;
+ ret = -EINVAL;
goto cleanup;
}
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;
}
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");
}
/* 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,
/* 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,
}
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);
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