From patchwork Fri Oct 26 23:49:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: bananaman255@gmail.com X-Patchwork-Id: 10799 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 2C45744CEBC for ; Sat, 27 Oct 2018 02:58:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9558768A23A; Sat, 27 Oct 2018 02:57:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C654A68A12C for ; Sat, 27 Oct 2018 02:57:35 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id g9-v6so2897830wrq.4 for ; Fri, 26 Oct 2018 16:58:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=koTTeSIS4F3z/iukneqDsbS7VpBNeGHW8XVP2t4boYE=; b=j15MN4qvmlt5Hfz3ZPTQFrRVfiIS6IoOmN+sww7Rt0UPcE4uS1PqYYQ59qUKvOrFlu nM836PCZJKS7xPwLuedHsVlfCJ18h4FzNJ4gii446zUqiJW8hGPdK95vYAHfSCkmlG55 1rj7q7+Hj58/L16uykVZ4jbzZesXoLe5jGpwhumH63iXHA+djvym8hb8jANxKtRawmFO phQkaZbBwdTbrk1reVud8X+1OZPBx3DXv8L5+Laa4Whar27PkkTJwTZcmDs2ugZtZ1Cl 2VcX7dt6+iUlUCdNzhe0K2reERfvKabKpABjwE5dRBaPXZblV0qwDAq/REuTm29xREgV 5DQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=koTTeSIS4F3z/iukneqDsbS7VpBNeGHW8XVP2t4boYE=; b=TbYKYC/wACXZexv3rXCrHXz/nIhwfLLrfOfTaNpgL//zd4BRsnE31NoSjQayfeXEvb y2jDXV9o4EHxQE+lNVLImh/d7Zdd6Sv7L8HAq2/VG/pAetDjCI0sS6nxwhu/y/wqhJOG p4vD5tz/4TYEBpSdjcV24+/eNR7JS1v2eMUa/x8PwxKNKQ1kLyoBFCqOElJFiHqhnmfr 5qYZN06gkbSzNHhOJ7QwrBuDam4iv8PgqmpjOyIJAVp+hLCPaRjpQ3WX8Q1aFRzpTaXR YwMW0FXHFjwyjYM3wwR4l1GBJEPFs4POR1oKLV9xYqDp6CSMMeXJfKf6ubac9dY02iob WwHw== X-Gm-Message-State: AGRZ1gJ2EcGZRv18iQC6jYLCP4UzXnxhpdFzF2I/znooVTahhem7M3qy NqH4y6G9InrfT4kJ2KE9p0XbBAYh X-Google-Smtp-Source: AJdET5fqmyMvyBSWQp8ljWXqxyWQl9Wp33bUT40A8x2XY/9XPRS3pmVUGdc0Rqg7qaHF1W5cQXIxZA== X-Received: by 2002:adf:e551:: with SMTP id z17-v6mr7005596wrm.238.1540597842645; Fri, 26 Oct 2018 16:50:42 -0700 (PDT) Received: from localhost.localdomain (117.98.132.37.dynamic.jazztel.es. [37.132.98.117]) by smtp.googlemail.com with ESMTPSA id a125-v6sm3286622wmf.8.2018.10.26.16.50.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 26 Oct 2018 16:50:41 -0700 (PDT) From: bananaman255@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 27 Oct 2018 01:49:50 +0200 Message-Id: <20181026234950.4220-1-bananaman255@gmail.com> X-Mailer: git-send-email 2.11.0.windows.3 Subject: [FFmpeg-devel] [PATCH] avcodec/wmaprodec: improve XMA missing samples 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 Cc: bnnm MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: bnnm Writes missing (delay) samples after EOF. Signed-off-by: bnnm --- libavcodec/wmaprodec.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c index 9439bfa771..d0fa974c80 100644 --- a/libavcodec/wmaprodec.c +++ b/libavcodec/wmaprodec.c @@ -210,6 +210,7 @@ typedef struct WMAProDecodeCtx { int subframe_offset; ///< subframe offset in the bit reservoir uint8_t packet_loss; ///< set in case of bitstream error uint8_t packet_done; ///< set when a packet is fully decoded + uint8_t eof_done; ///< set when EOF reached and extra subframe is written (XMA1/2) /* frame decode state */ uint32_t frame_num; ///< current frame number (not used for decoding) @@ -1609,7 +1610,34 @@ static int decode_packet(AVCodecContext *avctx, WMAProDecodeCtx *s, *got_frame_ptr = 0; - if (s->packet_done || s->packet_loss) { + if (!buf_size) { + AVFrame *frame = data; + int i; + + /** Must output remaining samples after stream end. WMAPRO 5.1 created + * by XWMA encoder don't though (maybe only 1/2ch streams need it). */ + s->packet_done = 0; + if (s->eof_done) + return 0; + + /** clean output buffer and copy last IMDCT samples */ + for (i = 0; i < s->nb_channels; i++) { + memset(frame->extended_data[i], 0, + s->samples_per_frame * sizeof(*s->channel[i].out)); + + memcpy(frame->extended_data[i], s->channel[i].out, + s->samples_per_frame * sizeof(*s->channel[i].out) >> 1); + } + + /* TODO: XMA should output 128 samples only (instead of 512) and WMAPRO + * maybe 768 (with 2048), XMA needs changes in multi-stream handling though. */ + + s->eof_done = 1; + s->packet_done = 1; + *got_frame_ptr = 1; + return 0; + } + else if (s->packet_done || s->packet_loss) { s->packet_done = 0; /** sanity check for the buffer length */ @@ -1922,6 +1950,7 @@ static void flush(WMAProDecodeCtx *s) sizeof(*s->channel[i].out)); s->packet_loss = 1; s->skip_packets = 0; + s->eof_done = 0; } @@ -1976,7 +2005,7 @@ AVCodec ff_xma1_decoder = { .init = xma_decode_init, .close = xma_decode_end, .decode = xma_decode_packet, - .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, + .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, }; @@ -1991,7 +2020,7 @@ AVCodec ff_xma2_decoder = { .close = xma_decode_end, .decode = xma_decode_packet, .flush = xma_flush, - .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, + .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, };