int out_buf_size;
uint8_t *out_buf;
int out_picture_size;
+ uint8_t *out_picture;
struct SwsContext *sw_scale_ctx;
AVPacket in_packet;
+ AVPacket out_packet;
int got_picture;
+ int got_packet;
int ret = 0;
ret = video_input_init(&input_ctx, input_format_string, input_path, input_options);
picture_scaled->linesize);
if (output_ctx.raw_output) {
+ out_picture = out_buf;
out_picture_size = out_buf_size;
} else {
picture_scaled->quality = (output_ctx.codec_ctx)->global_quality;
- /* TODO: switch to avcodec_encode_video2() eventually */
- out_picture_size = avcodec_encode_video(output_ctx.codec_ctx,
- out_buf,
- out_buf_size,
- picture_scaled);
- if (out_picture_size < 0) {
+ av_init_packet(&out_packet);
+ out_packet.data = NULL;
+ out_packet.size = 0;
+ got_packet = 0;
+ ret = avcodec_encode_video2(output_ctx.codec_ctx,
+ &out_packet,
+ picture_scaled,
+ &got_packet);
+ if (ret < 0 || !got_packet) {
fprintf(stderr, "cannot encode video\n");
- ret = out_picture_size;
run = 0;
goto end_while;
}
+
+ out_picture = out_packet.data;
+ out_picture_size = out_packet.size;
}
#ifdef DEBUG
else
snprintf(filename, NAME_MAX, "out.raw");
file = fopen(filename, "wb");
- fwrite(out_buf, 1, out_picture_size, file);
+ fwrite(out_picture, 1, out_picture_size, file);
fclose(file);
#endif
- ret = am7xxx_send_image(dev,
+ ret = am7xxx_send_image_async(dev,
image_format,
(output_ctx.codec_ctx)->width,
(output_ctx.codec_ctx)->height,
- out_buf,
+ out_picture,
out_picture_size);
if (ret < 0) {
perror("am7xxx_send_image");
}
}
end_while:
+ if (!output_ctx.raw_output)
+ av_free_packet(&out_packet);
av_free_packet(&in_packet);
}
default:
fprintf(stderr, "Invalid zoom mode value, must be between %d and %d\n",
AM7XXX_ZOOM_ORIGINAL, AM7XXX_ZOOM_TEST);
- exit(EXIT_FAILURE);
+ ret = -EINVAL;
+ goto out;
}
break;
case 'h':
usage(argv[0]);
ret = 0;
goto out;
- break;
default: /* '?' */
usage(argv[0]);
ret = -EINVAL;
}
if (input_path == NULL) {
- fprintf(stderr, "The -i option must always be passed\n");
+ fprintf(stderr, "The -i option must always be passed\n\n");
+ usage(argv[0]);
ret = -EINVAL;
goto out;
}