On 1/18/2021 2:39 PM, Nachiket Tarate wrote:
+typedef struct AVParserContext {
+    const uint8_t   *buf_in;
+    const uint8_t   *buf_end;
+    uint8_t         *buf_out;
+    int             next_start_code_length;
+} AVParserContext;

The AV prefix in structs names should not be used for an internal struct used in a single file.

[...]

+/*
+ * Parse 'dec3' EC3SpecificBox
+ */
+static int parse_dec3(AC3HeaderInfo **phdr, const uint8_t *buf, size_t size)
+{
+    GetBitContext gb;
+    AC3HeaderInfo *hdr;
+    int err;
+
+    int data_rate, fscod, acmod, lfeon;
+
+    if (!*phdr)
+        *phdr = av_mallocz(sizeof(AC3HeaderInfo));

sizeof(AC3HeaderInfo) is not meant to be used outside of libavcodec. It's why avpriv_ac3_parse_header() resides in libavcodec and allocates it when used from libavformat.

Since parsing the dec3 atom is trivial, you can do it directly in ff_hls_parse_audio_setup_info and store the values in local independent variables (or even straight to st->codecpar) without the need for an AC3HeaderInfo struct.

+    if (!*phdr)
+        return AVERROR(ENOMEM);
+    hdr = *phdr;
+
+    err = init_get_bits8(&gb, buf, size);
+    if (err < 0)
+        return AVERROR_INVALIDDATA;
+
+    data_rate = get_bits(&gb, 13);
+    skip_bits(&gb, 3);
+    fscod = get_bits(&gb, 2);
+    skip_bits(&gb, 10);
+    acmod = get_bits(&gb, 3);
+    lfeon = get_bits(&gb, 1);
+
+    hdr->sample_rate = eac3_sample_rate_tab[fscod];
+
+    hdr->channel_layout = avpriv_ac3_channel_layout_tab[acmod];
+    if (lfeon)
+        hdr->channel_layout |= AV_CH_LOW_FREQUENCY;
+
+    hdr->channels = av_get_channel_layout_nb_channels(hdr->channel_layout);
+
+    hdr->bit_rate = data_rate*1000;
+
+    return 0;
+}
+
+int ff_hls_parse_audio_setup_info(AVStream *st, HLSAudioSetupInfo *info)
+{
+    int ret = 0;
+
+    AC3HeaderInfo *ac3hdr = NULL;
+
+    st->codecpar->codec_tag = info->codec_tag;
+
+    if (st->codecpar->codec_id == AV_CODEC_ID_AAC)
+        return 0;
+
+    st->codecpar->extradata = av_mallocz(info->setup_data_length + 
AV_INPUT_BUFFER_PADDING_SIZE);
+
+    if (!st->codecpar->extradata)
+        return AVERROR(ENOMEM);
+
+    st->codecpar->extradata_size = info->setup_data_length;
+
+    if (st->codecpar->codec_id == AV_CODEC_ID_AC3)
+        ret = avpriv_ac3_parse_header(&ac3hdr, info->setup_data, 
info->setup_data_length);

Are you sure this is correct? avpriv_ac3_parse_header() parses raw ac3 and eac3 frame headers, and if eac3 here is supposedly stored as a dec3 atom, wouldn't ac3 be the same using a dac3 atom?

+    else if (st->codecpar->codec_id == AV_CODEC_ID_EAC3)
+        ret = parse_dec3(&ac3hdr, info->setup_data, info->setup_data_length);
+    else
+        return -1;

AVERROR_INVALIDDATA. Is this function going to be called with other codec ids to trigger this path?

[...]

@@ -2019,9 +2075,14 @@ static int hls_read_header(AVFormatContext *s)
          * on us if they want to.
          */
         if (pls->is_id3_timestamped || (pls->n_renditions > 0 && 
pls->renditions[0]->type == AVMEDIA_TYPE_AUDIO)) {
+            if (seg && seg->key_type == KEY_SAMPLE_AES && 
pls->audio_setup_info.setup_data_length > 0 &&
+                pls->ctx->nb_streams == 1) {
+                ff_hls_parse_audio_setup_info(pls->ctx->streams[0], 
&pls->audio_setup_info);

The return value is being ignored.

+            } else {
             ret = avformat_find_stream_info(pls->ctx, NULL);
             if (ret < 0)
                 goto fail;
+            }
         }
pls->has_noheader_flag = !!(pls->ctx->ctx_flags & AVFMTCTX_NOHEADER);


_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to