Compatible with the binary encoder attached to ticket #6596 (right-aligned) and a sample from a SEG Mp3-Player (left-aligned).
Unified · Split
| @@ -33,6 +33,7 @@ version <next>: · 32 unmodified lines | |||
| 33 | - tlut2 video filter | 33 | - tlut2 video filter |
| 34 | - floodfill video filter | 34 | - floodfill video filter |
| 35 | - pseudocolor video filter | 35 | - pseudocolor video filter |
| 36 | - raw G.726 demuxer, left- and right-justified | ||
| 36 | 37 | ||
| 37 | version 3.3: | 38 | version 3.3: |
| 38 | - CrystalHD decoder moved to new decode API | 39 | - CrystalHD decoder moved to new decode API |
| @@ -341,6 +341,7 @@ library: · 340 unmodified lines | |||
| 341 | @item FunCom ISS @tab @tab X | 341 | @item FunCom ISS @tab @tab X |
| 342 | @tab Audio format used in various games from FunCom like The Longest Journey. | 342 | @tab Audio format used in various games from FunCom like The Longest Journey. |
| 343 | @item G.723.1 @tab X @tab X | 343 | @item G.723.1 @tab X @tab X |
| 344 | @item G.726 @tab @tab X @tab Both left- and right-justified. | ||
| 344 | @item G.729 BIT @tab X @tab X | 345 | @item G.729 BIT @tab X @tab X |
| 345 | @item G.729 raw @tab @tab X | 346 | @item G.729 raw @tab @tab X |
| 346 | @item GENH @tab @tab X | 347 | @item GENH @tab @tab X |
| @@ -188,6 +188,8 @@ OBJS-$(CONFIG_GSM_MUXER) += rawenc.o · 187 unmodified lines | |||
| 188 | OBJS-$(CONFIG_GXF_DEMUXER) += gxf.o | 188 | OBJS-$(CONFIG_GXF_DEMUXER) += gxf.o |
| 189 | OBJS-$(CONFIG_GXF_MUXER) += gxfenc.o audiointerleave.o | 189 | OBJS-$(CONFIG_GXF_MUXER) += gxfenc.o audiointerleave.o |
| 190 | OBJS-$(CONFIG_G722_DEMUXER) += g722.o rawdec.o | 190 | OBJS-$(CONFIG_G722_DEMUXER) += g722.o rawdec.o |
| 191 | OBJS-$(CONFIG_G726_DEMUXER) += g726.o | ||
| 192 | OBJS-$(CONFIG_G726LE_DEMUXER) += g726.o | ||
| 191 | OBJS-$(CONFIG_G722_MUXER) += rawenc.o | 193 | OBJS-$(CONFIG_G722_MUXER) += rawenc.o |
| 192 | OBJS-$(CONFIG_G723_1_DEMUXER) += g723_1.o | 194 | OBJS-$(CONFIG_G723_1_DEMUXER) += g723_1.o |
| 193 | OBJS-$(CONFIG_G723_1_MUXER) += rawenc.o | 195 | OBJS-$(CONFIG_G723_1_MUXER) += rawenc.o |
| @@ -132,6 +132,8 @@ static void register_all(void) · 131 unmodified lines | |||
| 132 | REGISTER_DEMUXER (FRM, frm); | 132 | REGISTER_DEMUXER (FRM, frm); |
| 133 | REGISTER_DEMUXER (FSB, fsb); | 133 | REGISTER_DEMUXER (FSB, fsb); |
| 134 | REGISTER_MUXDEMUX(G722, g722); | 134 | REGISTER_MUXDEMUX(G722, g722); |
| 135 | REGISTER_DEMUXER (G726, g726); | ||
| 136 | REGISTER_DEMUXER (G726LE, g726le); | ||
| 135 | REGISTER_MUXDEMUX(G723_1, g723_1); | 137 | REGISTER_MUXDEMUX(G723_1, g723_1); |
| 136 | REGISTER_DEMUXER (G729, g729); | 138 | REGISTER_DEMUXER (G729, g729); |
| 137 | REGISTER_DEMUXER (GDV, gdv); | 139 | REGISTER_DEMUXER (GDV, gdv); |
| @@ -0,0 +1,105 @@ | |||
| 1 | /* | ||
| 2 | * G.726 raw demuxer | ||
| 3 | * Copyright 2017 Carl Eugen Hoyos | ||
| 4 | * | ||
| 5 | * This file is part of FFmpeg. | ||
| 6 | * | ||
| 7 | * FFmpeg is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU Lesser General Public | ||
| 9 | * License as published by the Free Software Foundation; either | ||
| 10 | * version 2.1 of the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * Lesser General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU Lesser General Public | ||
| 18 | * License along with FFmpeg; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #include "avformat.h" | ||
| 23 | #include "internal.h" | ||
| 24 | #include "libavutil/opt.h" | ||
| 25 | |||
| 26 | typedef struct G726Context { | ||
| 27 | AVClass *class; | ||
| 28 | int code_size; | ||
| 29 | int sample_rate; | ||
| 30 | } G726Context; | ||
| 31 | |||
| 32 | static int g726_read_header(AVFormatContext *s) | ||
| 33 | { | ||
| 34 | G726Context *c = s->priv_data; | ||
| 35 | AVStream *st = avformat_new_stream(s, NULL); | ||
| 36 | if (!st) | ||
| 37 | return AVERROR(ENOMEM); | ||
| 38 | |||
| 39 | st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; | ||
| 40 | st->codecpar->codec_id = s->iformat->raw_codec_id; | ||
| 41 | |||
| 42 | st->codecpar->sample_rate = c->sample_rate; | ||
| 43 | st->codecpar->bits_per_coded_sample = c->code_size; | ||
| 44 | st->codecpar->bit_rate = ((int[]){ 16000, 24000, 32000, 40000 })[c->code_size - 2]; | ||
| 45 | st->codecpar->channels = 1; | ||
| 46 | |||
| 47 | return 0; | ||
| 48 | } | ||
| 49 | |||
| 50 | static int g726_read_packet(AVFormatContext *s, AVPacket *pkt) | ||
| 51 | { | ||
| 52 | int res; | ||
| 53 | res = av_get_packet(s->pb, pkt, 1020); // a size similar to RAW_PACKET_SIZE divisible by all code_size values | ||
| 54 | if (res < 0) | ||
| 55 | return res; | ||
| 56 | return 0; | ||
| 57 | } | ||
| 58 | |||
| 59 | #define OFFSET(x) offsetof(G726Context, x) | ||
| 60 | static const AVOption options[] = { | ||
| 61 | { "code_size", "Bits per G.726 code", | ||
| 62 | OFFSET(code_size), AV_OPT_TYPE_INT, {.i64 = 4}, 2, 5, AV_OPT_FLAG_DECODING_PARAM }, | ||
| 63 | { "sample_rate", "", | ||
| 64 | OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 8000}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | ||
| 65 | { NULL }, | ||
| 66 | }; | ||
| 67 | |||
| 68 | #if CONFIG_G726_DEMUXER | ||
| 69 | static const AVClass g726le_demuxer_class = { | ||
| 70 | .class_name = "G.726 big-endian demuxer", | ||
| 71 | .item_name = av_default_item_name, | ||
| 72 | .option = options, | ||
| 73 | .version = LIBAVUTIL_VERSION_INT, | ||
| 74 | }; | ||
| 75 | |||
| 76 | AVInputFormat ff_g726_demuxer = { | ||
| 77 | .name = "g726", | ||
| 78 | .long_name = NULL_IF_CONFIG_SMALL("raw big-endian G.726 (\"left aligned\")"), | ||
| 79 | .read_header = g726_read_header, | ||
| 80 | .read_packet = g726_read_packet, | ||
| 81 | .priv_data_size = sizeof(G726Context), | ||
| 82 | .priv_class = &g726le_demuxer_class, | ||
| 83 | .raw_codec_id = AV_CODEC_ID_ADPCM_G726, | ||
| 84 | }; | ||
| 85 | #endif | ||
| 86 | |||
| 87 | #if CONFIG_G726LE_DEMUXER | ||
| 88 | static const AVClass g726_demuxer_class = { | ||
| 89 | .class_name = "G.726 little-endian demuxer", | ||
| 90 | .item_name = av_default_item_name, | ||
| 91 | .option = options, | ||
| 92 | .version = LIBAVUTIL_VERSION_INT, | ||
| 93 | }; | ||
| 94 | |||
| 95 | AVInputFormat ff_g726le_demuxer = { | ||
| 96 | .name = "g726le", | ||
| 97 | .long_name = NULL_IF_CONFIG_SMALL("raw little-endian G.726 (\"right aligned\")"), | ||
| 98 | .read_header = g726_read_header, | ||
| 99 | .read_packet = g726_read_packet, | ||
| 100 | .priv_data_size = sizeof(G726Context), | ||
| 101 | .priv_class = &g726_demuxer_class, | ||
| 102 | .raw_codec_id = AV_CODEC_ID_ADPCM_G726LE, | ||
| 103 | }; | ||
| 104 | #endif | ||
| 105 | |||
| @@ -32,7 +32,7 @@ · 31 unmodified lines | |||
| 32 | // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) | 32 | // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) |
| 33 | // Also please add any ticket numbers that you believe might be affected here | 33 | // Also please add any ticket numbers that you believe might be affected here |
| 34 | #define LIBAVFORMAT_VERSION_MAJOR 57 | 34 | #define LIBAVFORMAT_VERSION_MAJOR 57 |
| 35 | #define LIBAVFORMAT_VERSION_MINOR 76 | 35 | #define LIBAVFORMAT_VERSION_MINOR 77 |
| 36 | #define LIBAVFORMAT_VERSION_MICRO 100 | 36 | #define LIBAVFORMAT_VERSION_MICRO 100 |
| 37 | 37 | ||
| 38 | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | 38 | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ |