[FFmpeg-devel] avformat/mpegenc - reject unsupported audio streams

Submitted by Gyan on July 8, 2019, 12:05 p.m.

Details

Message ID 89a2a366-de1c-8dd6-116c-f16a990fd907@gyani.pro
State New
Headers show

Commit Message

Gyan July 8, 2019, 12:05 p.m.
On 25-04-2019 01:48 PM, Gyan wrote:
>
>
> On 25-04-2019 01:23 PM, Ali KIZIL wrote:
>>
>> There are also Dolby Codecs (ac3 & eac3). Will it also throw error for
>> these codecs ?
>
> AC3   is      supported before and after this patch.
> EAC3 is unsupported before and after this patch.
>
> But it's sent to the same decoder, so support could be added. I'll check.

Attached patch allows muxing EAC3 in MPEG-PS.  Stock ffmpeg can demux 
and decode such streams fine.

Gyan
From 4558eab851efc252fc6cac4aff4f557b5768004a Mon Sep 17 00:00:00 2001
From: Gyan Doshi <ffmpeg@gyani.pro>
Date: Mon, 8 Jul 2019 17:04:21 +0530
Subject: [PATCH] avformat/mpegenc: allow muxing eac3 streams

---
 libavformat/mpegenc.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Gyan July 17, 2019, 4:20 a.m.
On 08-07-2019 05:35 PM, Gyan wrote:
>
>
> On 25-04-2019 01:48 PM, Gyan wrote:
>>
>>
>> On 25-04-2019 01:23 PM, Ali KIZIL wrote:
>>>
>>> There are also Dolby Codecs (ac3 & eac3). Will it also throw error for
>>> these codecs ?
>>
>> AC3   is      supported before and after this patch.
>> EAC3 is unsupported before and after this patch.
>>
>> But it's sent to the same decoder, so support could be added. I'll 
>> check.
>
> Attached patch allows muxing EAC3 in MPEG-PS.  Stock ffmpeg can demux 
> and decode such streams fine.

Will push tonight.

Gyan
Carl Eugen Hoyos July 17, 2019, 8:53 a.m.
> Am 08.07.2019 um 14:05 schrieb Gyan <ffmpeg@gyani.pro>:
> 
> 
> 
>> On 25-04-2019 01:48 PM, Gyan wrote:
>> 
>> 
>>> On 25-04-2019 01:23 PM, Ali KIZIL wrote:
>>> 
>>> There are also Dolby Codecs (ac3 & eac3). Will it also throw error for
>>> these codecs ?
>> 
>> AC3   is      supported before and after this patch.
>> EAC3 is unsupported before and after this patch.
>> 
>> But it's sent to the same decoder, so support could be added. I'll check.
> 
> Attached patch allows muxing EAC3 in MPEG-PS.  Stock ffmpeg can demux and decode such streams fine.

Which descriptor is used for eac3?
Please do not commit just because decoding works with FFmpeg, at least try to find some specification.

Carl Eugen
Gyan July 19, 2019, 10:44 a.m.
On 17-07-2019 02:23 PM, Carl Eugen Hoyos wrote:
>
>
>> Am 08.07.2019 um 14:05 schrieb Gyan <ffmpeg@gyani.pro>:
>>
>>
>>
>>> On 25-04-2019 01:48 PM, Gyan wrote:
>>>
>>>
>>>> On 25-04-2019 01:23 PM, Ali KIZIL wrote:
>>>>
>>>> There are also Dolby Codecs (ac3 & eac3). Will it also throw error for
>>>> these codecs ?
>>> AC3   is      supported before and after this patch.
>>> EAC3 is unsupported before and after this patch.
>>>
>>> But it's sent to the same decoder, so support could be added. I'll check.
>> Attached patch allows muxing EAC3 in MPEG-PS.  Stock ffmpeg can demux and decode such streams fine.
> Which descriptor is used for eac3?
> Please do not commit just because decoding works with FFmpeg, at least try to find some specification.

The PS muxer appears to use System A and this is what the ATSC A/52 
(2012) standard says,

"For System A, this section extends the use ofthe AC-3 Registration 
Descriptor defined in Section A3 in combination with the E-AC-3 
stream_type value defined below."

and

"E-AC-3 bit streams shall be identified with a stream_typevalue of 0x87 
when transmitted as PES streams conforming to ATSC-published standards."

Note that the stream_type value of AC-3 is 0x81 yet our id sequence 
starts from 0x80.  This patch uses the same descriptor series as AC-3, 
however if I switch to 0x87, only one such stream may be muxed as 0x88 
was assigned (by you) to DTS. Also, our demuxer sets the codec_id to DTS 
for 0x88 to 0x8f.

Both stock ffmpeg and VlC 4.0 nightly play files using the current 
patch. Mediainfo also identifies the codec correctly.

Comments?

Gyan

Patch hide | download patch | download mbox

diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
index 43ebc46e0e..15b191bc9d 100644
--- a/libavformat/mpegenc.c
+++ b/libavformat/mpegenc.c
@@ -352,6 +352,7 @@  static av_cold int mpeg_mux_init(AVFormatContext *ctx)
         case AVMEDIA_TYPE_AUDIO:
             if (!s->is_mpeg2 &&
                 (st->codecpar->codec_id == AV_CODEC_ID_AC3 ||
+                 st->codecpar->codec_id == AV_CODEC_ID_EAC3 ||
                  st->codecpar->codec_id == AV_CODEC_ID_DTS ||
                  st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE ||
                  st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD))
@@ -360,7 +361,8 @@  static av_cold int mpeg_mux_init(AVFormatContext *ctx)
                         "consider using the vob or the dvd muxer "
                         "to force a MPEG-2 program stream.\n",
                         avcodec_get_name(st->codecpar->codec_id));
-            if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
+            if (st->codecpar->codec_id == AV_CODEC_ID_AC3 ||
+                st->codecpar->codec_id == AV_CODEC_ID_EAC3) {
                 stream->id = ac3_id++;
             } else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) {
                 stream->id = dts_id++;
@@ -415,7 +417,7 @@  static av_cold int mpeg_mux_init(AVFormatContext *ctx)
             } else if (st->codecpar->codec_id != AV_CODEC_ID_MP1 &&
                        st->codecpar->codec_id != AV_CODEC_ID_MP2 &&
                        st->codecpar->codec_id != AV_CODEC_ID_MP3) {
-                       av_log(ctx, AV_LOG_ERROR, "Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3 or dts.\n");
+                       av_log(ctx, AV_LOG_ERROR, "Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3, eac3 or dts.\n");
                        goto fail;
             } else {
                 stream->id = mpa_id++;