From patchwork Sat Oct 7 14:51:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carl Eugen Hoyos X-Patchwork-Id: 5451 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp761174jah; Sat, 7 Oct 2017 07:52:18 -0700 (PDT) X-Received: by 10.28.146.18 with SMTP id u18mr4155873wmd.28.1507387938434; Sat, 07 Oct 2017 07:52:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507387938; cv=none; d=google.com; s=arc-20160816; b=nQAiVXatCvRLkhyiDyDidLaebGKTR97cWxp6voHge8eVWPUtlbEcjETFoeaIM+DTJ+ BkiVy7JzwJIq8EeMQBQAhDRfbABLgGKTL+5VSlO4LyT03U0JVfIFmlAImMI0WIn6Hob+ 3guUs8rHikKTLhmH4NGMJIQMiDoCSJ8SKjvfk43u2jBnqIcN/t2GpufRcW/FLWsM3K2x frkMAGs7eME7xCKerQf/SNFKhXGrMtGaFW9GLNx4tbykT24tH94BC7f4v3VMDWgnxRwM ZBxU10D3lKkJSTASOUNXUDg3cRHfYPFP+zpYnxY+94hSEPO3hoVIxMQxFDFMdmZkLR3d hYMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:to :message-id:date:from:references:in-reply-to:mime-version :dkim-signature:delivered-to:arc-authentication-results; bh=fT44uu46pTg2Nvs/0i2Yhgx4nrDShGey3DTRHO/uWm8=; b=T1e+GRrqvu7qhAn1I2ko9ID5LI48zj4UrJYo0JfLesF7SoRe8tHAQyPAki/nkVokgs iHpOANIT/pFlqcsBzy22V9HkUAp+YbYrI5NXivvfHpIqAyioCEhMpQ/NpgOnXnZt182X T7CqP5sszV4CJTQiCxkEwzRybljUZD5M/IRhju8urty/tnbLZgzX+fQbclug7P/JwECL tljFuR5c0xnEwDaW2/H8O0tx0s5p4kKRzUJOK4MXcCafeLRGc/fL8yvR4utiolv19RYW MHNTmZZGWHh3OJaqT4p6qL8OXhU8QcvCBmhloelVrO+19Z8DmA7j+G5NwYI0ydET9CmH Uq6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ZdLQN+zo; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u13si3771454wrb.325.2017.10.07.07.52.17; Sat, 07 Oct 2017 07:52:18 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ZdLQN+zo; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AB524689BD2; Sat, 7 Oct 2017 17:52:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io0-f178.google.com (mail-io0-f178.google.com [209.85.223.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6EE20689AF8 for ; Sat, 7 Oct 2017 17:52:08 +0300 (EEST) Received: by mail-io0-f178.google.com with SMTP id q11so18213448ioe.10 for ; Sat, 07 Oct 2017 07:52:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=0uks58xFr85ps2lhnagJXe0qIDhcudxsmhCLCx6tsqU=; b=ZdLQN+zoEAxdEs4jm4rdeW7i3dwX3DrwtZsyTJUrItsNHaOjVqGOZBEivNT9QEUTUH m5w7ZKmcXrtsCeNBqy7+XaltavPFpTGFScl3yxAR1d5AB8/mHXTKcq8tcRGyDQ12Afya wrmnNuJNPL1qOMpeEbmxRw2rh9xYDLfnwsiMJ7Q5Rde073v8oWbkQuuvjsyptYlTBDho /pe2Nz4UVgQjhu/L49gxziOralW2pJoBdEOKYDw5HjnM2tpmNnyMQ6iUBVrQzRASGDzf MzjSHtmG6FwuQ9aN5R5T7mg0/9M94P2JFOPbWsNJ9S6ydWUcNmNtGm1DxfiGl3+U+ZCF Kxfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=0uks58xFr85ps2lhnagJXe0qIDhcudxsmhCLCx6tsqU=; b=ZgHZLYZ7ETdNh4fAWdt40mVi8NjgGdzrd7dmQiVo7fuxTa+nWabYqnDMev0DQAN/oe VH9sF2f9uTX5rR0pB1KsmzForI2nzzKUIg7MC7f7+3Dt3chpzO6+cH43g0pmba6IbK4d gyeB9eEvqlpMCQWQGOrJd5ukpStKHM8b67ON+7VSMCMsPAHqs91arGZ66SjYCPNqZOCB JDL7SCwWt22nXQ/8JxUtjHBOrYQDEHpJW3451eGTc0pJdAq4YN93HbbL/HJEnRS6idgE VYr217ndcw440bMgV3F7SslMLMRgXDEaHuZV7Ijwo57lip2npqBZ0Xy5iKJPUoOe2WfQ a6kQ== X-Gm-Message-State: AMCzsaVlxg7LAlN4PHPT8QydSKwKVXs0IgkMxmLZYAXeWaEYtbOK4emK Vda6edAXi0ECoZngIXosSJszfftwItbI0Hg8Aeo= X-Google-Smtp-Source: AOwi7QAc3TohmnXpWu1glE1m03PJS+aiPlq6ewqqavyn+6x6F0YptmG2yGB6aSbmIIktv37bafO92PsbdRlK27RjsN8= X-Received: by 10.107.162.3 with SMTP id l3mr7212621ioe.227.1507387927936; Sat, 07 Oct 2017 07:52:07 -0700 (PDT) MIME-Version: 1.0 Received: by 10.2.134.74 with HTTP; Sat, 7 Oct 2017 07:51:47 -0700 (PDT) In-Reply-To: References: From: Carl Eugen Hoyos Date: Sat, 7 Oct 2017 16:51:47 +0200 Message-ID: To: FFmpeg development discussions and patches Subject: Re: [FFmpeg-devel] [PATCH]lavf/amr: Add amrnb and amrwb demuxers 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" 2017-10-01 18:23 GMT+02:00 Carl Eugen Hoyos : > 2017-09-27 18:08 GMT+02:00 Carl Eugen Hoyos : > >> The existing amr demuxer does not allow reading streams, >> it requires the 3GPP-conforming file header. >> Attached patch allows reading amrnb and amrwb from (live) >> streams, fixes ticket #6678. > > New patch with auto-detection attached, passes probecheck. Simplified patch attached that does not duplicate two small arrays in the object file that are already duplicated in the source code. The uninitialized variable is also fixed. I intend to apply soon, Carl Eugen From 0f6592b1b7e3d01dd5c853b3269c4d47d49fed9f Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Sat, 7 Oct 2017 16:50:55 +0200 Subject: [PATCH] lavf/amr: Add amrnb and amrwb demuxers. Fixes ticket #6678. --- libavformat/Makefile | 2 + libavformat/allformats.c | 2 + libavformat/amr.c | 116 ++++++++++++++++++++++++++++++++++++++++++---- libavformat/version.h | 4 +- 4 files changed, 112 insertions(+), 12 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index df709c29..c4c8713 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -87,6 +87,8 @@ OBJS-$(CONFIG_AIFF_MUXER) += aiffenc.o id3v2enc.o OBJS-$(CONFIG_AIX_DEMUXER) += aixdec.o OBJS-$(CONFIG_AMR_DEMUXER) += amr.o OBJS-$(CONFIG_AMR_MUXER) += amr.o +OBJS-$(CONFIG_AMRNB_DEMUXER) += amr.o +OBJS-$(CONFIG_AMRWB_DEMUXER) += amr.o OBJS-$(CONFIG_ANM_DEMUXER) += anm.o OBJS-$(CONFIG_APC_DEMUXER) += apc.o OBJS-$(CONFIG_APE_DEMUXER) += ape.o apetag.o img2.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 405ddb5..dc8984e 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -63,6 +63,8 @@ static void register_all(void) REGISTER_MUXDEMUX(AIFF, aiff); REGISTER_DEMUXER (AIX, aix); REGISTER_MUXDEMUX(AMR, amr); + REGISTER_DEMUXER (AMRNB, amrnb); + REGISTER_DEMUXER (AMRWB, amrwb); REGISTER_DEMUXER (ANM, anm); REGISTER_DEMUXER (APC, apc); REGISTER_DEMUXER (APE, ape); diff --git a/libavformat/amr.c b/libavformat/amr.c index b5194a2..da2e28b 100644 --- a/libavformat/amr.c +++ b/libavformat/amr.c @@ -38,6 +38,14 @@ typedef struct { static const char AMR_header[] = "#!AMR\n"; static const char AMRWB_header[] = "#!AMR-WB\n"; +static const uint8_t amrnb_packed_size[16] = { + 13, 14, 16, 18, 20, 21, 27, 32, 6, 1, 1, 1, 1, 1, 1, 1 +}; +static const uint8_t amrwb_packed_size[16] = { + 18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 1, 1, 1, 1, 1, 1 +}; + + #if CONFIG_AMR_MUXER static int amr_write_header(AVFormatContext *s) { @@ -126,17 +134,9 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt) mode = (toc >> 3) & 0x0F; if (par->codec_id == AV_CODEC_ID_AMR_NB) { - static const uint8_t packed_size[16] = { - 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 - }; - - size = packed_size[mode] + 1; + size = amrnb_packed_size[mode]; } else if (par->codec_id == AV_CODEC_ID_AMR_WB) { - static const uint8_t packed_size[16] = { - 18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1 - }; - - size = packed_size[mode]; + size = amrwb_packed_size[mode]; } if (!size || av_new_packet(pkt, size)) @@ -176,6 +176,102 @@ AVInputFormat ff_amr_demuxer = { }; #endif +#if CONFIG_AMRNB_DEMUXER +static int amrnb_probe(AVProbeData *p) +{ + int mode, i = 0, valid = 0; + const uint8_t *b = p->buf; + + while (i < p->buf_size) { + mode = b[i] >> 3 & 0x0F; + if (mode < 9 && (b[i] & 0x4) == 0x4) { + i += amrnb_packed_size[mode]; + valid++; + } else { + valid = 0; + i++; + } + } + if (valid > 100) + return AVPROBE_SCORE_EXTENSION / 2 + 1; + return 0; +} + +static int amrnb_read_header(AVFormatContext *s) +{ + AVStream *st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_tag = MKTAG('s', 'a', 'm', 'r'); + st->codecpar->codec_id = AV_CODEC_ID_AMR_NB; + st->codecpar->sample_rate = 8000; + st->codecpar->channels = 1; + st->codecpar->channel_layout = AV_CH_LAYOUT_MONO; + st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; + avpriv_set_pts_info(st, 64, 1, 8000); + + return 0; +} + +AVInputFormat ff_amrnb_demuxer = { + .name = "amrnb", + .long_name = NULL_IF_CONFIG_SMALL("raw AMR-NB"), + .priv_data_size = sizeof(AMRContext), + .read_probe = amrnb_probe, + .read_header = amrnb_read_header, + .read_packet = amr_read_packet, + .flags = AVFMT_GENERIC_INDEX, +}; +#endif + +#if CONFIG_AMRWB_DEMUXER +static int amrwb_probe(AVProbeData *p) +{ + int mode, i = 0, valid = 0; + const uint8_t *b = p->buf; + + while (i < p->buf_size) { + mode = b[i] >> 3 & 0x0F; + if (mode < 10 && (b[i] & 0x4) == 0x4) { + i += amrwb_packed_size[mode]; + valid++; + } else { + valid = 0; + i++; + } + } + if (valid > 100) + return AVPROBE_SCORE_EXTENSION / 2 + 1; + return 0; +} + +static int amrwb_read_header(AVFormatContext *s) +{ + AVStream *st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_tag = MKTAG('s', 'a', 'w', 'b'); + st->codecpar->codec_id = AV_CODEC_ID_AMR_WB; + st->codecpar->sample_rate = 16000; + st->codecpar->channels = 1; + st->codecpar->channel_layout = AV_CH_LAYOUT_MONO; + st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; + avpriv_set_pts_info(st, 64, 1, 16000); + + return 0; +} + +AVInputFormat ff_amrwb_demuxer = { + .name = "amrwb", + .long_name = NULL_IF_CONFIG_SMALL("raw AMR-WB"), + .priv_data_size = sizeof(AMRContext), + .read_probe = amrwb_probe, + .read_header = amrwb_read_header, + .read_packet = amr_read_packet, + .flags = AVFMT_GENERIC_INDEX, +}; +#endif + #if CONFIG_AMR_MUXER AVOutputFormat ff_amr_muxer = { .name = "amr", diff --git a/libavformat/version.h b/libavformat/version.h index ac6edf7..878917d 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 57 -#define LIBAVFORMAT_VERSION_MINOR 82 -#define LIBAVFORMAT_VERSION_MICRO 102 +#define LIBAVFORMAT_VERSION_MINOR 83 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ -- 1.7.10.4