From patchwork Sat Dec 12 15:45:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24549 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3C81444AF80 for ; Sat, 12 Dec 2020 17:46:28 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1FB1A68A9FC; Sat, 12 Dec 2020 17:46:28 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D963C68A882 for ; Sat, 12 Dec 2020 17:46:19 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id EB345296D97 for ; Sat, 12 Dec 2020 16:46:17 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id MYAaz-E6o7K9 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id 50FC2296D95 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id AFC053A02B2; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:49 +0100 Message-Id: <20201212154555.21243-1-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/7] tools/target_dec_fuzzer: use non-obsolete decoding API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- tools/target_dec_fuzzer.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tools/target_dec_fuzzer.c b/tools/target_dec_fuzzer.c index 11530cbf79..23ffca3923 100644 --- a/tools/target_dec_fuzzer.c +++ b/tools/target_dec_fuzzer.c @@ -88,6 +88,14 @@ static int subtitle_handler(AVCodecContext *avctx, void *frame, return ret; } +static int audio_video_handler(AVCodecContext *avctx, AVFrame *frame, + int *got_frame, const AVPacket *dummy) +{ + int ret = avcodec_receive_frame(avctx, frame); + *got_frame = ret >= 0; + return ret; +} + // Ensure we don't loop forever const uint32_t maxiteration = 8096; const uint64_t maxpixels_per_frame = 4096 * 4096; @@ -133,8 +141,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { } switch (c->type) { - case AVMEDIA_TYPE_AUDIO : decode_handler = avcodec_decode_audio4; break; - case AVMEDIA_TYPE_VIDEO : decode_handler = avcodec_decode_video2; break; + case AVMEDIA_TYPE_AUDIO : + case AVMEDIA_TYPE_VIDEO : decode_handler = audio_video_handler ; break; case AVMEDIA_TYPE_SUBTITLE: decode_handler = subtitle_handler ; break; } switch (c->id) { @@ -194,7 +202,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (ctx->max_pixels == 0 || ctx->max_pixels > maxpixels_per_frame) ctx->max_pixels = maxpixels_per_frame; //To reduce false positive OOM and hangs - ctx->refcounted_frames = 1; //To reduce false positive timeouts and focus testing on the refcounted API ctx->max_samples = maxsamples_per_frame; @@ -306,6 +313,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { last = data; while (parsepkt.size > 0) { + int decode_more; if (parser) { av_init_packet(&avpkt); @@ -338,8 +346,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { avcodec_flush_buffers(ctx); flushpattern = (flushpattern >> 3) + (flushpattern << 61); + if (ctx->codec_type != AVMEDIA_TYPE_SUBTITLE) { + int ret = avcodec_send_packet(ctx, &avpkt); + decode_more = ret >= 0; + } else + decode_more = 1; + // Iterate through all data - while (avpkt.size > 0 && it++ < maxiteration) { + while (decode_more && it++ < maxiteration) { av_frame_unref(frame); int ret = decode_handler(ctx, frame, &got_frame, &avpkt); @@ -360,10 +374,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { if (ret <= 0 || ret > avpkt.size) break; - if (ctx->codec_type != AVMEDIA_TYPE_AUDIO) - ret = avpkt.size; - avpkt.data += ret; - avpkt.size -= ret; + + if (ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) { + avpkt.data += ret; + avpkt.size -= ret; + decode_more = avpkt.size > 0; + } else + decode_more = ret >= 0; } av_packet_unref(&avpkt); } @@ -373,6 +390,9 @@ maximums_reached: av_packet_unref(&avpkt); + if (ctx->codec_type != AVMEDIA_TYPE_SUBTITLE) + avcodec_send_packet(ctx, NULL); + do { got_frame = 0; av_frame_unref(frame); From patchwork Sat Dec 12 15:45:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24553 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E595644AF80 for ; Sat, 12 Dec 2020 17:46:31 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CE61C68A9DB; Sat, 12 Dec 2020 17:46:31 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 96B84689D15 for ; Sat, 12 Dec 2020 17:46:25 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id D34C2296D92 for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id jDdrMsRRlfVs for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id 46EF3296D93 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id B17903A02B1; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:50 +0100 Message-Id: <20201212154555.21243-2-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201212154555.21243-1-anton@khirnov.net> References: <20201212154555.21243-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/7] api-h264-test: use non-obsolete decoding API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- tests/api/api-h264-test.c | 85 ++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/tests/api/api-h264-test.c b/tests/api/api-h264-test.c index 678a1ea166..04bdfbc9d2 100644 --- a/tests/api/api-h264-test.c +++ b/tests/api/api-h264-test.c @@ -37,15 +37,13 @@ static int video_decode_example(const char *input_filename) AVCodecParameters *origin_par = NULL; AVFrame *fr = NULL; uint8_t *byte_buffer = NULL; - AVPacket pkt; + AVPacket *pkt; AVFormatContext *fmt_ctx = NULL; int number_of_written_bytes; int video_stream; - int got_frame = 0; int byte_buffer_size; int i = 0; int result; - int end_of_stream = 0; result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); if (result < 0) { @@ -97,6 +95,12 @@ static int video_decode_example(const char *input_filename) return AVERROR(ENOMEM); } + pkt = av_packet_alloc(); + if (!pkt) { + av_log(NULL, AV_LOG_ERROR, "Cannot allocate packet\n"); + return AVERROR(ENOMEM); + } + byte_buffer_size = av_image_get_buffer_size(ctx->pix_fmt, ctx->width, ctx->height, 16); byte_buffer = av_malloc(byte_buffer_size); if (!byte_buffer) { @@ -106,43 +110,60 @@ static int video_decode_example(const char *input_filename) printf("#tb %d: %d/%d\n", video_stream, fmt_ctx->streams[video_stream]->time_base.num, fmt_ctx->streams[video_stream]->time_base.den); i = 0; - av_init_packet(&pkt); - do { - if (!end_of_stream) - if (av_read_frame(fmt_ctx, &pkt) < 0) - end_of_stream = 1; - if (end_of_stream) { - pkt.data = NULL; - pkt.size = 0; + + result = 0; + while (result >= 0) { + result = av_read_frame(fmt_ctx, pkt); + if (result >= 0 && pkt->stream_index != video_stream) { + av_packet_unref(pkt); + continue; + } + + if (result < 0) + result = avcodec_send_packet(ctx, NULL); + else { + if (pkt->pts == AV_NOPTS_VALUE) + pkt->pts = pkt->dts = i; + result = avcodec_send_packet(ctx, pkt); } - if (pkt.stream_index == video_stream || end_of_stream) { - got_frame = 0; - if (pkt.pts == AV_NOPTS_VALUE) - pkt.pts = pkt.dts = i; - result = avcodec_decode_video2(ctx, fr, &got_frame, &pkt); - if (result < 0) { + av_packet_unref(pkt); + + if (result < 0) { + av_log(NULL, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); + return result; + } + + while (result >= 0) { + result = avcodec_receive_frame(ctx, fr); + if (result == AVERROR_EOF) + goto finish; + else if (result == AVERROR(EAGAIN)) { + result = 0; + break; + } else if (result < 0) { av_log(NULL, AV_LOG_ERROR, "Error decoding frame\n"); return result; } - if (got_frame) { - number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, - (const uint8_t* const *)fr->data, (const int*) fr->linesize, - ctx->pix_fmt, ctx->width, ctx->height, 1); - if (number_of_written_bytes < 0) { - av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n"); - return number_of_written_bytes; - } - printf("%d, %s, %s, %8"PRId64", %8d, 0x%08lx\n", video_stream, - av_ts2str(fr->pts), av_ts2str(fr->pkt_dts), fr->pkt_duration, - number_of_written_bytes, av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes)); + + number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, + (const uint8_t* const *)fr->data, (const int*) fr->linesize, + ctx->pix_fmt, ctx->width, ctx->height, 1); + if (number_of_written_bytes < 0) { + av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n"); + av_frame_unref(fr); + return number_of_written_bytes; } - av_packet_unref(&pkt); - av_init_packet(&pkt); + printf("%d, %s, %s, %8"PRId64", %8d, 0x%08lx\n", video_stream, + av_ts2str(fr->pts), av_ts2str(fr->pkt_dts), fr->pkt_duration, + number_of_written_bytes, av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes)); + + av_frame_unref(fr); } i++; - } while (!end_of_stream || got_frame); + } - av_packet_unref(&pkt); +finish: + av_packet_free(&pkt); av_frame_free(&fr); avformat_close_input(&fmt_ctx); avcodec_free_context(&ctx); From patchwork Sat Dec 12 15:45:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24550 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3232B44AF80 for ; Sat, 12 Dec 2020 17:46:29 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 16BC968A9EA; Sat, 12 Dec 2020 17:46:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DBC1968A8BD for ; Sat, 12 Dec 2020 17:46:19 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id 6FC72296D95 for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 3Owm4kqH6s2J for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id 44E9E296C25 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id B3E993A02B6; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:51 +0100 Message-Id: <20201212154555.21243-3-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201212154555.21243-1-anton@khirnov.net> References: <20201212154555.21243-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/7] api-band-test: use non-obsolete decoding API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- tests/api/api-band-test.c | 90 +++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/tests/api/api-band-test.c b/tests/api/api-band-test.c index 257e741694..34bed1d6be 100644 --- a/tests/api/api-band-test.c +++ b/tests/api/api-band-test.c @@ -71,14 +71,12 @@ static int video_decode(const char *input_filename) AVCodecParameters *origin_par = NULL; uint8_t *byte_buffer = NULL; AVFrame *fr = NULL; - AVPacket pkt; + AVPacket *pkt; AVFormatContext *fmt_ctx = NULL; int number_of_written_bytes; int video_stream; - int got_frame = 0; int byte_buffer_size; int result; - int end_of_stream = 0; draw_horiz_band_called = 0; @@ -135,6 +133,12 @@ static int video_decode(const char *input_filename) return AVERROR(ENOMEM); } + pkt = av_packet_alloc(); + if (!pkt) { + av_log(NULL, AV_LOG_ERROR, "Cannot allocate packet\n"); + return AVERROR(ENOMEM); + } + if (strcmp(codec->name, "flv") && strcmp(codec->name, "mpeg4") && strcmp(codec->name, "huffyuv")) { av_log(NULL, AV_LOG_ERROR, "Wrong codec\n"); return -1; @@ -155,48 +159,60 @@ static int video_decode(const char *input_filename) memset(slice_byte_buffer, 0, byte_buffer_size); slice_byte_buffer_size = byte_buffer_size; - av_init_packet(&pkt); - do { - if (!end_of_stream) { - if (av_read_frame(fmt_ctx, &pkt) < 0) { - end_of_stream = 1; - } + result = 0; + while (result >= 0) { + result = av_read_frame(fmt_ctx, pkt); + if (result >= 0 && pkt->stream_index != video_stream) { + av_packet_unref(pkt); + continue; } - if (end_of_stream) { - pkt.data = NULL; - pkt.size = 0; + + if (result < 0) + result = avcodec_send_packet(ctx, NULL); + else + result = avcodec_send_packet(ctx, pkt); + + av_packet_unref(pkt); + + if (result < 0) { + av_log(NULL, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); + return result; } - if (pkt.stream_index == video_stream || end_of_stream) { - got_frame = 0; - result = avcodec_decode_video2(ctx, fr, &got_frame, &pkt); - if (result < 0) { + + while (result >= 0) { + result = avcodec_receive_frame(ctx, fr); + if (result == AVERROR_EOF) + goto finish; + else if (result == AVERROR(EAGAIN)) { + result = 0; + break; + } else if (result < 0) { av_log(NULL, AV_LOG_ERROR, "Error decoding frame\n"); return result; } - if (got_frame) { - number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, - (const uint8_t* const *)fr->data, (const int*) fr->linesize, - ctx->pix_fmt, ctx->width, ctx->height, 1); - if (number_of_written_bytes < 0) { - av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n"); - return number_of_written_bytes; - } - if (draw_horiz_band_called == 0) { - av_log(NULL, AV_LOG_ERROR, "draw_horiz_band haven't been called!\n"); - return -1; - } - if (av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes) != - av_adler32_update(0, (const uint8_t*)slice_byte_buffer, number_of_written_bytes)) { - av_log(NULL, AV_LOG_ERROR, "Decoded frames with and without draw_horiz_band are not the same!\n"); - return -1; - } + + number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, + (const uint8_t* const *)fr->data, (const int*) fr->linesize, + ctx->pix_fmt, ctx->width, ctx->height, 1); + if (number_of_written_bytes < 0) { + av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n"); + return number_of_written_bytes; + } + if (draw_horiz_band_called == 0) { + av_log(NULL, AV_LOG_ERROR, "draw_horiz_band haven't been called!\n"); + return -1; + } + if (av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes) != + av_adler32_update(0, (const uint8_t*)slice_byte_buffer, number_of_written_bytes)) { + av_log(NULL, AV_LOG_ERROR, "Decoded frames with and without draw_horiz_band are not the same!\n"); + return -1; } - av_packet_unref(&pkt); - av_init_packet(&pkt); + av_frame_unref(fr); } - } while (!end_of_stream || got_frame); + } - av_packet_unref(&pkt); +finish: + av_packet_free(&pkt); av_frame_free(&fr); avformat_close_input(&fmt_ctx); avcodec_free_context(&ctx); From patchwork Sat Dec 12 15:45:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24551 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 19E5344AF80 for ; Sat, 12 Dec 2020 17:46:30 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 010F968A7F4; Sat, 12 Dec 2020 17:46:30 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D48A56881ED for ; Sat, 12 Dec 2020 17:46:19 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id 6F858296D94 for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id ns6wkUyV_DE7 for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id 45DAE296D92 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id BA46D3A02C5; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:52 +0100 Message-Id: <20201212154555.21243-4-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201212154555.21243-1-anton@khirnov.net> References: <20201212154555.21243-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/7] api-seek-test: use non-obsolete decoding API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- tests/api/api-seek-test.c | 104 +++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/tests/api/api-seek-test.c b/tests/api/api-seek-test.c index ae33581244..bb9f5c89b3 100644 --- a/tests/api/api-seek-test.c +++ b/tests/api/api-seek-test.c @@ -73,16 +73,14 @@ static int compare_crc_in_array(uint32_t crc, int64_t pts) } static int compute_crc_of_packets(AVFormatContext *fmt_ctx, int video_stream, - AVCodecContext *ctx, AVFrame *fr, uint64_t ts_start, uint64_t ts_end, int no_seeking) + AVCodecContext *ctx, AVPacket *pkt, AVFrame *fr, + uint64_t ts_start, uint64_t ts_end, int no_seeking) { int number_of_written_bytes; - int got_frame = 0; int result; - int end_of_stream = 0; int byte_buffer_size; uint8_t *byte_buffer; uint32_t crc; - AVPacket pkt; byte_buffer_size = av_image_get_buffer_size(ctx->pix_fmt, ctx->width, ctx->height, 16); byte_buffer = av_malloc(byte_buffer_size); @@ -101,53 +99,66 @@ static int compute_crc_of_packets(AVFormatContext *fmt_ctx, int video_stream, avcodec_flush_buffers(ctx); } - av_init_packet(&pkt); do { - if (!end_of_stream) - if (av_read_frame(fmt_ctx, &pkt) < 0) - end_of_stream = 1; - if (end_of_stream) { - pkt.data = NULL; - pkt.size = 0; + result = av_read_frame(fmt_ctx, pkt); + if (result >= 0 && pkt->stream_index != video_stream) { + av_packet_unref(pkt); + continue; } - if (pkt.stream_index == video_stream || end_of_stream) { - got_frame = 0; - if ((pkt.pts == AV_NOPTS_VALUE) && (!end_of_stream)) { + + if (result < 0) + result = avcodec_send_packet(ctx, NULL); + else { + if (pkt->pts == AV_NOPTS_VALUE) { av_log(NULL, AV_LOG_ERROR, "Error: frames doesn't have pts values\n"); return -1; } - result = avcodec_decode_video2(ctx, fr, &got_frame, &pkt); - if (result < 0) { + result = avcodec_send_packet(ctx, pkt); + } + + av_packet_unref(pkt); + + if (result < 0) { + av_log(NULL, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); + return result; + } + + while (result >= 0) { + result = avcodec_receive_frame(ctx, fr); + if (result == AVERROR_EOF) + goto finish; + else if (result == AVERROR(EAGAIN)) { + result = 0; + break; + } else if (result < 0) { av_log(NULL, AV_LOG_ERROR, "Error decoding frame\n"); return result; } - if (got_frame) { - number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, - (const uint8_t* const *)fr->data, (const int*) fr->linesize, - ctx->pix_fmt, ctx->width, ctx->height, 1); - if (number_of_written_bytes < 0) { - av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n"); - return number_of_written_bytes; - } - if ((!no_seeking) && (fr->pts > ts_end)) - break; - crc = av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes); - printf("%10"PRId64", 0x%08"PRIx32"\n", fr->pts, crc); - if (no_seeking) { - if (add_crc_to_array(crc, fr->pts) < 0) - return -1; - } - else { - if (compare_crc_in_array(crc, fr->pts) < 0) - return -1; - } + + number_of_written_bytes = av_image_copy_to_buffer(byte_buffer, byte_buffer_size, + (const uint8_t* const *)fr->data, (const int*) fr->linesize, + ctx->pix_fmt, ctx->width, ctx->height, 1); + if (number_of_written_bytes < 0) { + av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n"); + return number_of_written_bytes; + } + if ((!no_seeking) && (fr->pts > ts_end)) + break; + crc = av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes); + printf("%10"PRId64", 0x%08"PRIx32"\n", fr->pts, crc); + if (no_seeking) { + if (add_crc_to_array(crc, fr->pts) < 0) + return -1; + } + else { + if (compare_crc_in_array(crc, fr->pts) < 0) + return -1; } + av_frame_unref(fr); } - av_packet_unref(&pkt); - av_init_packet(&pkt); - } while ((!end_of_stream || got_frame) && (no_seeking || (fr->pts + fr->pkt_duration <= ts_end))); + } while (result >= 0 && (no_seeking || (fr->pts + fr->pkt_duration <= ts_end))); - av_packet_unref(&pkt); +finish: av_freep(&byte_buffer); return 0; @@ -176,6 +187,7 @@ static int seek_test(const char *input_filename, const char *start, const char * AVCodec *codec = NULL; AVCodecContext *ctx= NULL; AVCodecParameters *origin_par = NULL; + AVPacket *pkt = NULL; AVFrame *fr = NULL; AVFormatContext *fmt_ctx = NULL; int video_stream; @@ -250,13 +262,20 @@ static int seek_test(const char *input_filename, const char *start, const char * goto end; } - result = compute_crc_of_packets(fmt_ctx, video_stream, ctx, fr, 0, 0, 1); + pkt = av_packet_alloc(); + if (!pkt) { + av_log(NULL, AV_LOG_ERROR, "Cannot allocate packet\n"); + result = AVERROR(ENOMEM); + goto end; + } + + result = compute_crc_of_packets(fmt_ctx, video_stream, ctx, pkt, fr, 0, 0, 1); if (result != 0) goto end; for (i = start_ts; i < end_ts; i += 100) { for (j = i + 100; j < end_ts; j += 100) { - result = compute_crc_of_packets(fmt_ctx, video_stream, ctx, fr, i, j, 0); + result = compute_crc_of_packets(fmt_ctx, video_stream, ctx, pkt, fr, i, j, 0); if (result != 0) break; } @@ -265,6 +284,7 @@ static int seek_test(const char *input_filename, const char *start, const char * end: av_freep(&crc_array); av_freep(&pts_array); + av_packet_free(&pkt); av_frame_free(&fr); avformat_close_input(&fmt_ctx); avcodec_free_context(&ctx); From patchwork Sat Dec 12 15:45:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24547 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1AAA444AF80 for ; Sat, 12 Dec 2020 17:46:26 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E83EB68A987; Sat, 12 Dec 2020 17:46:25 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DDF2F68A8CD for ; Sat, 12 Dec 2020 17:46:19 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id E9516296D96 for ; Sat, 12 Dec 2020 16:46:17 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 0ifohatz7d4J for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id 4FFD6296D94 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id BE4523A02C6; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:53 +0100 Message-Id: <20201212154555.21243-5-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201212154555.21243-1-anton@khirnov.net> References: <20201212154555.21243-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/7] fate: add tests for AVID X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Samples cut from tickets 971 and 4741 --- tests/fate/video.mak | 6 ++++++ tests/ref/fate/avid-interlaced | 7 +++++++ tests/ref/fate/avid-meridian | 15 +++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 tests/ref/fate/avid-interlaced create mode 100644 tests/ref/fate/avid-meridian diff --git a/tests/fate/video.mak b/tests/fate/video.mak index 4877740863..a5f3107c38 100644 --- a/tests/fate/video.mak +++ b/tests/fate/video.mak @@ -43,6 +43,12 @@ fate-auravision-v1: CMD = framecrc -i $(TARGET_SAMPLES)/auravision/SOUVIDEO.AVI FATE_VIDEO-$(call DEMDEC, AVI, AURA2) += fate-auravision-v2 fate-auravision-v2: CMD = framecrc -i $(TARGET_SAMPLES)/auravision/salma-hayek-in-ugly-betty-partial-avi -an +FATE_VIDEO-$(call DEMDEC, AVI, AVRN) += fate-avid-interlaced +fate-avid-interlaced: CMD = framecrc -i $(TARGET_SAMPLES)/avid/avid_ntsc_interlaced.avi + +FATE_VIDEO-$(call DEMDEC, MOV, AVRN) += fate-avid-meridian +fate-avid-meridian: CMD = framecrc -i $(TARGET_SAMPLES)/avid/avidmeridianntsc.mov + FATE_VIDEO-$(call DEMDEC, BETHSOFTVID, BETHSOFTVID) += fate-bethsoft-vid fate-bethsoft-vid: CMD = framecrc -i $(TARGET_SAMPLES)/bethsoft-vid/ANIM0001.VID -t 5 -pix_fmt rgb24 -vf scale -af aresample diff --git a/tests/ref/fate/avid-interlaced b/tests/ref/fate/avid-interlaced new file mode 100644 index 0000000000..2efa5839cb --- /dev/null +++ b/tests/ref/fate/avid-interlaced @@ -0,0 +1,7 @@ +#tb 0: 100/2397 +#media_type 0: video +#codec_id 0: rawvideo +#dimensions 0: 720x486 +#sar 0: 0/1 +0, 0, 0, 1, 699840, 0xc59a264e +0, 1, 1, 1, 699840, 0x06f13712 diff --git a/tests/ref/fate/avid-meridian b/tests/ref/fate/avid-meridian new file mode 100644 index 0000000000..313351ed06 --- /dev/null +++ b/tests/ref/fate/avid-meridian @@ -0,0 +1,15 @@ +#tb 0: 20859/500000 +#media_type 0: video +#codec_id 0: rawvideo +#dimensions 0: 320x240 +#sar 0: 0/1 +0, 0, 0, 1, 153600, 0xbfd35869 +0, 1, 1, 1, 153600, 0xbe7c74a0 +0, 2, 2, 1, 153600, 0x9f2524ee +0, 3, 3, 1, 153600, 0x3c8df375 +0, 4, 4, 1, 153600, 0xe0ac5d7d +0, 5, 5, 1, 153600, 0xf0c6da50 +0, 6, 6, 1, 153600, 0xbd50751f +0, 7, 7, 1, 153600, 0x51caf5f7 +0, 8, 8, 1, 153600, 0x27752d4f +0, 9, 9, 1, 153600, 0x63a0d0dc From patchwork Sat Dec 12 15:45:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24548 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3FBEC44AF80 for ; Sat, 12 Dec 2020 17:46:27 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 25AE468A9ED; Sat, 12 Dec 2020 17:46:27 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D738F68A7F4 for ; Sat, 12 Dec 2020 17:46:19 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id C4131296C25 for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id iWlUn70lXm4y for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id D419D296D98 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id C27E53A02C7; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:54 +0100 Message-Id: <20201212154555.21243-6-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201212154555.21243-1-anton@khirnov.net> References: <20201212154555.21243-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/7] lavc/mjpegdec: cosmetics, org->orig X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/mjpegdec.c | 6 +++--- libavcodec/mjpegdec.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 82098e4295..ea3f125cca 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -172,7 +172,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) s->start_code = -1; s->first_picture = 1; s->got_picture = 0; - s->org_height = avctx->coded_height; + s->orig_height = avctx->coded_height; avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; avctx->colorspace = AVCOL_SPC_BT470BG; s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE; @@ -466,8 +466,8 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) /* test interlaced mode */ if (s->first_picture && (s->multiscope != 2 || s->avctx->time_base.den >= 25 * s->avctx->time_base.num) && - s->org_height != 0 && - s->height < ((s->org_height * 3) / 4)) { + s->orig_height != 0 && + s->height < ((s->orig_height * 3) / 4)) { s->interlaced = 1; s->bottom_field = s->interlace_polarity; s->picture_ptr->interlaced_frame = 1; diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h index d9844adf4e..be86ee5135 100644 --- a/libavcodec/mjpegdec.h +++ b/libavcodec/mjpegdec.h @@ -59,7 +59,7 @@ typedef struct MJpegDecodeContext { VLC vlcs[3][4]; int qscale[4]; ///< quantizer scale calculated from quant_matrixes - int org_height; /* size given at codec init */ + int orig_height; /* size given at codec init */ int first_picture; /* true if decoding first picture */ int interlaced; /* true if interlaced */ int bottom_field; /* true if bottom field */ From patchwork Sat Dec 12 15:45:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 24552 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D6D5F44AF80 for ; Sat, 12 Dec 2020 17:46:30 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BA89C68AA16; Sat, 12 Dec 2020 17:46:30 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.red.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 96D0968A987 for ; Sat, 12 Dec 2020 17:46:25 +0200 (EET) Received: from localhost (localhost [IPv6:::1]) by mail.red.khirnov.net (Postfix) with ESMTP id 24D6C296D93 for ; Sat, 12 Dec 2020 16:46:23 +0100 (CET) Received: from mail.red.khirnov.net ([IPv6:::1]) by localhost (mail.red.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id m2h3gMR_jG45 for ; Sat, 12 Dec 2020 16:46:18 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail.red.khirnov.net (Postfix) with ESMTPS id E5562296D99 for ; Sat, 12 Dec 2020 16:46:16 +0100 (CET) Received: by libav.khirnov.net (Postfix, from userid 1000) id C694F3A02CB; Sat, 12 Dec 2020 16:46:15 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 12 Dec 2020 16:45:55 +0100 Message-Id: <20201212154555.21243-7-anton@khirnov.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201212154555.21243-1-anton@khirnov.net> References: <20201212154555.21243-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/7] Handle AVID MJPEG streams directly in the MJPEG decoder. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" AVID streams, currently handled by the AVRN decoder can be (depending on extradata contents) either MJPEG or raw video. To decode the MJPEG variant, the AVRN decoder currently instantiates a MJPEG decoder internally and forwards decoded frames to the caller (possibly after cropping them). This is suboptimal, because the AVRN decoder does not forward all the features of the internal MJPEG decoder, such as direct rendering. Handling such forwarding in a full and generic manner would be quite hard, so it is simpler to just handle those streams in the MJPEG decoder directly. The AVRN decoder, which now handles only the raw streams, can now be marked as supporting direct rendering. This also removes the last remaining internal use of the obsolete decoding API. --- libavcodec/avrndec.c | 74 ++----------------------------------------- libavcodec/mjpegdec.c | 11 +++++++ libavcodec/version.h | 2 +- libavformat/avidec.c | 6 ++++ libavformat/isom.c | 2 +- libavformat/version.h | 2 +- tests/fate/video.mak | 2 +- 7 files changed, 23 insertions(+), 76 deletions(-) diff --git a/libavcodec/avrndec.c b/libavcodec/avrndec.c index d85e3c2000..a80851cefa 100644 --- a/libavcodec/avrndec.c +++ b/libavcodec/avrndec.c @@ -21,13 +21,10 @@ #include "avcodec.h" #include "internal.h" -#include "mjpeg.h" -#include "mjpegdec.h" + #include "libavutil/imgutils.h" typedef struct { - AVCodecContext *mjpeg_avctx; - int is_mjpeg; int interlace; int tff; } AVRnContext; @@ -37,42 +34,6 @@ static av_cold int init(AVCodecContext *avctx) AVRnContext *a = avctx->priv_data; int ret; - // Support "Resolution 1:1" for Avid AVI Codec - a->is_mjpeg = avctx->extradata_size < 31 || memcmp(&avctx->extradata[28], "1:1", 3); - - if(!a->is_mjpeg && avctx->lowres) { - av_log(avctx, AV_LOG_ERROR, "lowres is not possible with rawvideo\n"); - return AVERROR(EINVAL); - } - - if(a->is_mjpeg) { - const AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_MJPEG); - AVDictionary *thread_opt = NULL; - if (!codec) { - av_log(avctx, AV_LOG_ERROR, "MJPEG codec not found\n"); - return AVERROR_DECODER_NOT_FOUND; - } - - a->mjpeg_avctx = avcodec_alloc_context3(codec); - if (!a->mjpeg_avctx) - return AVERROR(ENOMEM); - - av_dict_set(&thread_opt, "threads", "1", 0); // Is this needed ? - a->mjpeg_avctx->refcounted_frames = 1; - a->mjpeg_avctx->flags = avctx->flags; - a->mjpeg_avctx->idct_algo = avctx->idct_algo; - a->mjpeg_avctx->lowres = avctx->lowres; - a->mjpeg_avctx->width = avctx->width; - a->mjpeg_avctx->height = avctx->height; - - if ((ret = avcodec_open2(a->mjpeg_avctx, codec, &thread_opt)) < 0) { - av_log(avctx, AV_LOG_ERROR, "MJPEG codec failed to open\n"); - } - av_dict_free(&thread_opt); - - return ret; - } - if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0) return ret; @@ -89,15 +50,6 @@ static av_cold int init(AVCodecContext *avctx) return 0; } -static av_cold int end(AVCodecContext *avctx) -{ - AVRnContext *a = avctx->priv_data; - - avcodec_free_context(&a->mjpeg_avctx); - - return 0; -} - static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { @@ -107,28 +59,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int buf_size = avpkt->size; int y, ret, true_height; - if(a->is_mjpeg) { - ret = avcodec_decode_video2(a->mjpeg_avctx, data, got_frame, avpkt); - - if (ret >= 0 && *got_frame && avctx->width <= p->width && avctx->height <= p->height) { - int shift = p->height - avctx->height; - int subsample_h, subsample_v; - - av_pix_fmt_get_chroma_sub_sample(p->format, &subsample_h, &subsample_v); - - p->data[0] += p->linesize[0] * shift; - if (p->data[2]) { - p->data[1] += p->linesize[1] * (shift>>subsample_v); - p->data[2] += p->linesize[2] * (shift>>subsample_v); - } - - p->width = avctx->width; - p->height = avctx->height; - } - avctx->pix_fmt = a->mjpeg_avctx->pix_fmt; - return ret; - } - true_height = buf_size / (2*avctx->width); if(buf_size < 2*avctx->width * avctx->height) { @@ -167,8 +97,8 @@ AVCodec ff_avrn_decoder = { .id = AV_CODEC_ID_AVRN, .priv_data_size = sizeof(AVRnContext), .init = init, - .close = end, .decode = decode_frame, .max_lowres = 3, + .capabilities = AV_CODEC_CAP_DR1, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, }; diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index ea3f125cca..39a05db35b 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -484,6 +484,11 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) size_change = 0; } + if ((s->avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') || + s->avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) && + s->orig_height < s->avctx->height) + s->avctx->height = s->orig_height; + if (s->avctx->codec_id == AV_CODEC_ID_SMVJPEG) { s->avctx->height = s->avctx->coded_height / s->smv_frames_per_jpeg; if (s->avctx->height <= 0) @@ -2897,6 +2902,12 @@ the_end: return ret; } } + if ((avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') || + avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) && + avctx->coded_height > s->orig_height) { + frame->height = avctx->coded_height; + frame->crop_top = frame->height - s->orig_height; + } ret = 0; diff --git a/libavcodec/version.h b/libavcodec/version.h index 5b92afe60a..abfbd63ac8 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #define LIBAVCODEC_VERSION_MAJOR 58 #define LIBAVCODEC_VERSION_MINOR 115 -#define LIBAVCODEC_VERSION_MICRO 102 +#define LIBAVCODEC_VERSION_MICRO 103 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 7e527e15ee..0c5fddd597 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -838,6 +838,12 @@ static int avi_read_header(AVFormatContext *s) st->codecpar->codec_tag == MKTAG('H', '2', '6', '5')) st->need_parsing = AVSTREAM_PARSE_FULL; + if (st->codecpar->codec_id == AV_CODEC_ID_AVRN && + st->codecpar->codec_tag == MKTAG('A', 'V', 'R', 'n') && + (st->codecpar->extradata_size < 31 || + memcmp(&st->codecpar->extradata[28], "1:1", 3))) + st->codecpar->codec_id = AV_CODEC_ID_MJPEG; + if (st->codecpar->codec_tag == 0 && st->codecpar->height > 0 && st->codecpar->extradata_size < 1U << 30) { st->codecpar->extradata_size += 9; diff --git a/libavformat/isom.c b/libavformat/isom.c index d1ef6e3407..db84bb417b 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -115,7 +115,7 @@ const AVCodecTag ff_codec_movvideo_tags[] = { { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */ { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */ - { AV_CODEC_ID_AVRN , MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */ + { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */ /* { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, *//* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */ { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') }, /* Motion JPEG OpenDML */ { AV_CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') }, /* Motion-JPEG (format B) */ diff --git a/libavformat/version.h b/libavformat/version.h index b43193bcb1..a2b5901e74 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -33,7 +33,7 @@ // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 #define LIBAVFORMAT_VERSION_MINOR 65 -#define LIBAVFORMAT_VERSION_MICRO 100 +#define LIBAVFORMAT_VERSION_MICRO 101 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ diff --git a/tests/fate/video.mak b/tests/fate/video.mak index a5f3107c38..0984b929cb 100644 --- a/tests/fate/video.mak +++ b/tests/fate/video.mak @@ -46,7 +46,7 @@ fate-auravision-v2: CMD = framecrc -i $(TARGET_SAMPLES)/auravision/salma-hayek-i FATE_VIDEO-$(call DEMDEC, AVI, AVRN) += fate-avid-interlaced fate-avid-interlaced: CMD = framecrc -i $(TARGET_SAMPLES)/avid/avid_ntsc_interlaced.avi -FATE_VIDEO-$(call DEMDEC, MOV, AVRN) += fate-avid-meridian +FATE_VIDEO-$(call DEMDEC, MOV, MJPEG) += fate-avid-meridian fate-avid-meridian: CMD = framecrc -i $(TARGET_SAMPLES)/avid/avidmeridianntsc.mov FATE_VIDEO-$(call DEMDEC, BETHSOFTVID, BETHSOFTVID) += fate-bethsoft-vid