This makes the currently semi-public avpriv_aac_parse_header() function
private to libavcodec and adds a proper public API function to return
the parts of the ADTS header required in libavformat.
---

This eliminates one more ABI issue with the new bitstream reader.

 configure                                     |  8 ++-
 doc/developer.texi                            |  2 +-
 libavcodec/Makefile                           | 15 +++---
 libavcodec/aac_adtstoasc_bsf.c                |  5 +-
 libavcodec/aac_parser.c                       |  3 +-
 libavcodec/{aacadtsdec.c => aacadts_header.c} |  4 +-
 libavcodec/{aacadtsdec.h => aacadts_header.h} |  9 ++--
 libavcodec/aacadtsdec.c                       | 71 +++++++++------------------
 libavcodec/aacadtsdec.h                       | 29 +++--------
 libavcodec/aacdec.c                           |  4 +-
 libavformat/spdifdec.c                        | 22 +++++----
 libavformat/spdifenc.c                        | 15 +++---
 12 files changed, 79 insertions(+), 108 deletions(-)
 copy libavcodec/{aacadtsdec.c => aacadts_header.c} (96%)
 copy libavcodec/{aacadtsdec.h => aacadts_header.h} (90%)

diff --git a/configure b/configure
index c7d0363..ce90e3f 100755
--- a/configure
+++ b/configure
@@ -1726,6 +1726,7 @@ HAVE_LIST="
 
 # options emitted with CONFIG_ prefix but not available on the command line
 CONFIG_EXTRA="
+    aacadts_header
     aandcttables
     ac3dsp
     audio_frame_queue
@@ -1966,7 +1967,7 @@ mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
 vc1dsp_select="h264chroma qpeldsp startcode"
 
 # decoders / encoders
-aac_decoder_select="imdct15 mdct sinewin"
+aac_decoder_select="aacadts_header imdct15 mdct sinewin"
 aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
 aac_latm_decoder_select="aac_decoder aac_latm_parser"
 ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
@@ -2280,6 +2281,7 @@ nvenc_h264_encoder_select="h264_nvenc_encoder"
 nvenc_hevc_encoder_select="hevc_nvenc_encoder"
 
 # parsers
+aac_parser_select="aacadts_header"
 h264_parser_select="golomb h264dsp h264parse"
 hevc_parser_select="hevc_ps"
 mpegaudio_parser_select="mpegaudioheader"
@@ -2288,6 +2290,7 @@ mpeg4video_parser_select="error_resilience h263dsp 
mpegvideo qpeldsp"
 vc1_parser_select="vc1dsp"
 
 # bitstream_filters
+aac_adtstoasc_bsf_select="aacadts_header"
 mjpeg2jpeg_bsf_select="jpegtables"
 
 # external libraries
@@ -2396,7 +2399,8 @@ sap_demuxer_select="sdp_demuxer"
 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
 sdp_demuxer_select="rtpdec"
 smoothstreaming_muxer_select="ismv_muxer"
-spdif_muxer_select="aac_parser"
+spdif_demuxer_select="aacadts_header"
+spdif_muxer_select="aacadts_header"
 spx_muxer_select="ogg_muxer"
 swf_demuxer_suggest="zlib"
 tak_demuxer_select="tak_parser"
diff --git a/doc/developer.texi b/doc/developer.texi
index 31c2baf..824fba4 100644
--- a/doc/developer.texi
+++ b/doc/developer.texi
@@ -218,7 +218,7 @@ e.g. @samp{ff_w64_demuxer}.
 @item
 For variables and functions visible outside of file scope, used internally
 across multiple libraries, use @code{avpriv_} as prefix, for example,
-@samp{avpriv_aac_parse_header}.
+@samp{avpriv_report_missing_feature}.
 
 @item
 For externally visible symbols, each library has its own prefix. Check
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index b60ba5e..793a266 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -1,7 +1,8 @@
 NAME = avcodec
 DESC = Libav codec library
 
-HEADERS = ac3_parser.h                                                  \
+HEADERS = aacadtsdec.h                                                  \
+          ac3_parser.h                                                  \
           avcodec.h                                                     \
           avfft.h                                                       \
           d3d11va.h                                                     \
@@ -15,7 +16,8 @@ HEADERS = ac3_parser.h                                        
          \
           version.h                                                     \
           vorbis_parser.h                                               \
 
-OBJS = ac3_parser.o                                                     \
+OBJS = aacadtsdec.o                                                     \
+       ac3_parser.o                                                     \
        allcodecs.o                                                      \
        avpacket.o                                                       \
        avpicture.o                                                      \
@@ -43,6 +45,7 @@ OBJS = ac3_parser.o                                           
          \
        xiph.o                                                           \
 
 # subsystems
+OBJS-$(CONFIG_AACADTS_HEADER)          += aacadts_header.o mpeg4audio.o
 OBJS-$(CONFIG_AANDCTTABLES)            += aandcttab.o
 OBJS-$(CONFIG_AC3DSP)                  += ac3dsp.o
 OBJS-$(CONFIG_AUDIO_FRAME_QUEUE)       += audio_frame_queue.o
@@ -126,7 +129,7 @@ OBJS-$(CONFIG_WMV2DSP)                 += wmv2dsp.o
 OBJS-$(CONFIG_A64MULTI_ENCODER)        += a64multienc.o elbg.o
 OBJS-$(CONFIG_A64MULTI5_ENCODER)       += a64multienc.o elbg.o
 OBJS-$(CONFIG_AAC_DECODER)             += aacdec.o aactab.o aacsbr.o aacps.o \
-                                          aacadtsdec.o mpeg4audio.o kbdwin.o \
+                                          mpeg4audio.o kbdwin.o \
                                           sbrdsp.o aacpsdsp.o
 OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o    \
                                           aacpsy.o aactab.o      \
@@ -666,7 +669,6 @@ OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += mpeg4audio.o
 OBJS-$(CONFIG_MATROSKA_MUXER)          += mpeg4audio.o
 OBJS-$(CONFIG_MOV_DEMUXER)             += ac3tab.o
 OBJS-$(CONFIG_NUT_MUXER)               += mpegaudiodata.o
-OBJS-$(CONFIG_SPDIF_DEMUXER)           += aacadtsdec.o mpeg4audio.o
 OBJS-$(CONFIG_SPDIF_MUXER)             += dca.o
 OBJS-$(CONFIG_TAK_DEMUXER)             += tak.o
 OBJS-$(CONFIG_WEBM_MUXER)              += mpeg4audio.o
@@ -722,7 +724,7 @@ OBJS-$(CONFIG_LIBXVID_ENCODER)            += libxvid.o
 # parsers
 OBJS-$(CONFIG_AAC_LATM_PARSER)         += latm_parser.o
 OBJS-$(CONFIG_AAC_PARSER)              += aac_parser.o aac_ac3_parser.o \
-                                          aacadtsdec.o mpeg4audio.o
+                                          mpeg4audio.o
 OBJS-$(CONFIG_AC3_PARSER)              += ac3tab.o aac_ac3_parser.o
 OBJS-$(CONFIG_ADX_PARSER)              += adx_parser.o adx.o
 OBJS-$(CONFIG_BMP_PARSER)              += bmp_parser.o
@@ -760,8 +762,7 @@ OBJS-$(CONFIG_VP3_PARSER)              += vp3_parser.o
 OBJS-$(CONFIG_VP8_PARSER)              += vp8_parser.o
 
 # bitstream filters
-OBJS-$(CONFIG_AAC_ADTSTOASC_BSF)          += aac_adtstoasc_bsf.o aacadtsdec.o \
-                                             mpeg4audio.o
+OBJS-$(CONFIG_AAC_ADTSTOASC_BSF)          += aac_adtstoasc_bsf.o mpeg4audio.o
 OBJS-$(CONFIG_CHOMP_BSF)                  += chomp_bsf.o
 OBJS-$(CONFIG_DUMP_EXTRADATA_BSF)         += dump_extradata_bsf.o
 OBJS-$(CONFIG_EXTRACT_EXTRADATA_BSF)      += extract_extradata_bsf.o    \
diff --git a/libavcodec/aac_adtstoasc_bsf.c b/libavcodec/aac_adtstoasc_bsf.c
index 08d60eb..0ce1160 100644
--- a/libavcodec/aac_adtstoasc_bsf.c
+++ b/libavcodec/aac_adtstoasc_bsf.c
@@ -19,8 +19,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "avcodec.h"
+#include "aacadts_header.h"
 #include "aacadtsdec.h"
+#include "avcodec.h"
 #include "bsf.h"
 #include "put_bits.h"
 #include "get_bits.h"
@@ -57,7 +58,7 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket 
*out)
     if (bsfc->par_in->extradata && show_bits(&gb, 12) != 0xfff)
         goto finish;
 
-    if (avpriv_aac_parse_header(&gb, &hdr) < 0) {
+    if (ff_aacadts_header_parse(&gb, &hdr) < 0) {
         av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
         ret = AVERROR_INVALIDDATA;
         goto fail;
diff --git a/libavcodec/aac_parser.c b/libavcodec/aac_parser.c
index eae120a..cd3be8e 100644
--- a/libavcodec/aac_parser.c
+++ b/libavcodec/aac_parser.c
@@ -22,6 +22,7 @@
 
 #include "parser.h"
 #include "aac_ac3_parser.h"
+#include "aacadts_header.h"
 #include "aacadtsdec.h"
 #include "get_bits.h"
 #include "mpeg4audio.h"
@@ -40,7 +41,7 @@ static int aac_sync(uint64_t state, AACAC3ParseContext 
*hdr_info,
     tmp.u64 = av_be2ne64(state);
     init_get_bits(&bits, tmp.u8+8-AAC_ADTS_HEADER_SIZE, AAC_ADTS_HEADER_SIZE * 
8);
 
-    if ((size = avpriv_aac_parse_header(&bits, &hdr)) < 0)
+    if ((size = ff_aacadts_header_parse(&bits, &hdr)) < 0)
         return 0;
     *need_next_header = 0;
     *new_frame_start  = 1;
diff --git a/libavcodec/aacadtsdec.c b/libavcodec/aacadts_header.c
similarity index 96%
copy from libavcodec/aacadtsdec.c
copy to libavcodec/aacadts_header.c
index 2994bce..81bb698 100644
--- a/libavcodec/aacadtsdec.c
+++ b/libavcodec/aacadts_header.c
@@ -22,11 +22,11 @@
  */
 
 #include "aac_ac3_parser.h"
-#include "aacadtsdec.h"
+#include "aacadts_header.h"
 #include "get_bits.h"
 #include "mpeg4audio.h"
 
-int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
+int ff_aacadts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
 {
     int size, rdb, ch, sr;
     int aot, crc_abs;
diff --git a/libavcodec/aacadtsdec.h b/libavcodec/aacadts_header.h
similarity index 90%
copy from libavcodec/aacadtsdec.h
copy to libavcodec/aacadts_header.h
index 6319efc..2c8a174 100644
--- a/libavcodec/aacadtsdec.h
+++ b/libavcodec/aacadts_header.h
@@ -20,10 +20,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVCODEC_AACADTSDEC_H
-#define AVCODEC_AACADTSDEC_H
+#ifndef AVCODEC_AACADTS_HEADER_H
+#define AVCODEC_AACADTS_HEADER_H
 
-#include <stdint.h>
 #include "get_bits.h"
 
 #define AAC_ADTS_HEADER_SIZE 7
@@ -49,6 +48,6 @@ typedef struct AACADTSHeaderInfo {
  * -2 if the version element is invalid, -3 if the sample rate
  * element is invalid, or -4 if the bit rate element is invalid.
  */
-int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr);
+int ff_aacadts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr);
 
-#endif /* AVCODEC_AACADTSDEC_H */
+#endif /* AVCODEC_AACADTS_HEADER_H */
diff --git a/libavcodec/aacadtsdec.c b/libavcodec/aacadtsdec.c
index 2994bce..cb599cf 100644
--- a/libavcodec/aacadtsdec.c
+++ b/libavcodec/aacadtsdec.c
@@ -1,9 +1,4 @@
 /*
- * Audio and Video frame extraction
- * Copyright (c) 2003 Fabrice Bellard
- * Copyright (c) 2003 Michael Niedermayer
- * Copyright (c) 2009 Alex Converse
- *
  * This file is part of Libav.
  *
  * Libav is free software; you can redistribute it and/or
@@ -21,50 +16,30 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "aac_ac3_parser.h"
-#include "aacadtsdec.h"
-#include "get_bits.h"
-#include "mpeg4audio.h"
-
-int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
-{
-    int size, rdb, ch, sr;
-    int aot, crc_abs;
-
-    if (get_bits(gbc, 12) != 0xfff)
-        return AAC_AC3_PARSE_ERROR_SYNC;
+#include "config.h"
 
-    skip_bits1(gbc);             /* id */
-    skip_bits(gbc, 2);           /* layer */
-    crc_abs = get_bits1(gbc);    /* protection_absent */
-    aot     = get_bits(gbc, 2);  /* profile_objecttype */
-    sr      = get_bits(gbc, 4);  /* sample_frequency_index */
-    if (!avpriv_mpeg4audio_sample_rates[sr])
-        return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
-    skip_bits1(gbc);             /* private_bit */
-    ch = get_bits(gbc, 3);       /* channel_configuration */
+#include <stddef.h>
+#include <stdint.h>
 
-    skip_bits1(gbc);             /* original/copy */
-    skip_bits1(gbc);             /* home */
-
-    /* adts_variable_header */
-    skip_bits1(gbc);             /* copyright_identification_bit */
-    skip_bits1(gbc);             /* copyright_identification_start */
-    size = get_bits(gbc, 13);    /* aac_frame_length */
-    if (size < AAC_ADTS_HEADER_SIZE)
-        return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
-
-    skip_bits(gbc, 11);          /* adts_buffer_fullness */
-    rdb = get_bits(gbc, 2);      /* number_of_raw_data_blocks_in_frame */
-
-    hdr->object_type    = aot + 1;
-    hdr->chan_config    = ch;
-    hdr->crc_absent     = crc_abs;
-    hdr->num_aac_frames = rdb + 1;
-    hdr->sampling_index = sr;
-    hdr->sample_rate    = avpriv_mpeg4audio_sample_rates[sr];
-    hdr->samples        = (rdb + 1) * 1024;
-    hdr->bit_rate       = size * 8 * hdr->sample_rate / hdr->samples;
+#include "aacadts_header.h"
+#include "aacadtsdec.h"
 
-    return size;
+int av_aacadts_header_parse(const uint8_t *buf, uint32_t *samples,
+                            uint8_t *frames)
+{
+#if CONFIG_AACADTS_HEADER
+    GetBitContext gb;
+    AACADTSHeaderInfo hdr;
+    int err = init_get_bits8(&gb, buf, AAC_ADTS_HEADER_SIZE);
+    if (err < 0)
+        return err;
+    err = ff_aacadts_header_parse(&gb, &hdr);
+    if (err < 0)
+        return err;
+    *samples = hdr.samples;
+    *frames  = hdr.num_aac_frames;
+    return 0;
+#else
+    return AVERROR(ENOSYS);
+#endif
 }
diff --git a/libavcodec/aacadtsdec.h b/libavcodec/aacadtsdec.h
index 6319efc..5d601c2 100644
--- a/libavcodec/aacadtsdec.h
+++ b/libavcodec/aacadtsdec.h
@@ -23,32 +23,19 @@
 #ifndef AVCODEC_AACADTSDEC_H
 #define AVCODEC_AACADTSDEC_H
 
+#include <stddef.h>
 #include <stdint.h>
-#include "get_bits.h"
 
 #define AAC_ADTS_HEADER_SIZE 7
 
-typedef struct AACADTSHeaderInfo {
-    uint32_t sample_rate;
-    uint32_t samples;
-    uint32_t bit_rate;
-    uint8_t  crc_absent;
-    uint8_t  object_type;
-    uint8_t  sampling_index;
-    uint8_t  chan_config;
-    uint8_t  num_aac_frames;
-} AACADTSHeaderInfo;
-
 /**
- * Parse AAC frame header.
- * Parse the ADTS frame header to the end of the variable header, which is
- * the first 54 bits.
- * @param[in]  gbc BitContext containing the first 54 bits of the frame.
- * @param[out] hdr Pointer to struct where header info is written.
- * @return Returns 0 on success, -1 if there is a sync word mismatch,
- * -2 if the version element is invalid, -3 if the sample rate
- * element is invalid, or -4 if the bit rate element is invalid.
+ * Extract the number of samples and frames from AAC data.
+ * @param[in]  buf     pointer to AAC data buffer
+ * @param[out] samples Pointer to where number of samples is written
+ * @param[out] frames  Pointer to where number of frames is written
+ * @return Returns 0 on success, error code on failure.
  */
-int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr);
+int av_aacadts_header_parse(const uint8_t *buf, uint32_t *samples,
+                            uint8_t *frames);
 
 #endif /* AVCODEC_AACADTSDEC_H */
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index 4ba346a..e488f6a 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -97,7 +97,7 @@
 #include "sbr.h"
 #include "aacsbr.h"
 #include "mpeg4audio.h"
-#include "aacadtsdec.h"
+#include "aacadts_header.h"
 #include "libavutil/intfloat.h"
 
 #include <assert.h>
@@ -2705,7 +2705,7 @@ static int parse_adts_frame_header(AACContext *ac, 
GetBitContext *gb)
     uint8_t layout_map[MAX_ELEM_ID*4][3];
     int layout_map_tags, ret;
 
-    size = avpriv_aac_parse_header(gb, &hdr_info);
+    size = ff_aacadts_header_parse(gb, &hdr_info);
     if (size > 0) {
         if (hdr_info.num_aac_frames != 1) {
             avpriv_report_missing_feature(ac->avctx,
diff --git a/libavformat/spdifdec.c b/libavformat/spdifdec.c
index 7c21235..810acb2 100644
--- a/libavformat/spdifdec.c
+++ b/libavformat/spdifdec.c
@@ -25,18 +25,22 @@
  * @author Anssi Hannula
  */
 
-#include "avformat.h"
-#include "spdif.h"
+#include "libavutil/bswap.h"
+
 #include "libavcodec/ac3.h"
 #include "libavcodec/aacadtsdec.h"
 
+#include "avformat.h"
+#include "spdif.h"
+
 static int spdif_get_offset_and_codec(AVFormatContext *s,
                                       enum IEC61937DataType data_type,
                                       const char *buf, int *offset,
                                       enum AVCodecID *codec)
 {
-    AACADTSHeaderInfo aac_hdr;
-    GetBitContext gbc;
+    uint32_t samples;
+    uint8_t frames;
+    int ret;
 
     switch (data_type & 0xff) {
     case IEC61937_AC3:
@@ -56,13 +60,13 @@ static int spdif_get_offset_and_codec(AVFormatContext *s,
         *codec = AV_CODEC_ID_MP3;
         break;
     case IEC61937_MPEG2_AAC:
-        init_get_bits(&gbc, buf, AAC_ADTS_HEADER_SIZE * 8);
-        if (avpriv_aac_parse_header(&gbc, &aac_hdr)) {
+        ret = av_aacadts_header_parse(buf, &samples, &frames);
+        if (ret < 0) {
             if (s) /* be silent during a probe */
                 av_log(s, AV_LOG_ERROR, "Invalid AAC packet in IEC 61937\n");
-            return AVERROR_INVALIDDATA;
+            return ret;
         }
-        *offset = aac_hdr.samples << 2;
+        *offset = samples << 2;
         *codec = AV_CODEC_ID_AAC;
         break;
     case IEC61937_MPEG2_LAYER1_LSF:
@@ -100,7 +104,7 @@ static int spdif_get_offset_and_codec(AVFormatContext *s,
 }
 
 /* Largest offset between bursts we currently handle, i.e. AAC with
-   aac_hdr.samples = 4096 */
+   samples = 4096 */
 #define SPDIF_MAX_OFFSET 16384
 
 static int spdif_probe(AVProbeData *p)
diff --git a/libavformat/spdifenc.c b/libavformat/spdifenc.c
index a9b3b52..e986ace 100644
--- a/libavformat/spdifenc.c
+++ b/libavformat/spdifenc.c
@@ -349,19 +349,18 @@ static int spdif_header_mpeg(AVFormatContext *s, AVPacket 
*pkt)
 static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
 {
     IEC61937Context *ctx = s->priv_data;
-    AACADTSHeaderInfo hdr;
-    GetBitContext gbc;
+    uint32_t samples;
+    uint8_t frames;
     int ret;
 
-    init_get_bits(&gbc, pkt->data, AAC_ADTS_HEADER_SIZE * 8);
-    ret = avpriv_aac_parse_header(&gbc, &hdr);
+    ret = av_aacadts_header_parse(pkt->data, &samples, &frames);
     if (ret < 0) {
         av_log(s, AV_LOG_ERROR, "Wrong AAC file format\n");
-        return AVERROR_INVALIDDATA;
+        return ret;
     }
 
-    ctx->pkt_offset = hdr.samples << 2;
-    switch (hdr.num_aac_frames) {
+    ctx->pkt_offset = samples << 2;
+    switch (frames) {
     case 1:
         ctx->data_type = IEC61937_MPEG2_AAC;
         break;
@@ -373,7 +372,7 @@ static int spdif_header_aac(AVFormatContext *s, AVPacket 
*pkt)
         break;
     default:
         av_log(s, AV_LOG_ERROR,
-               "%"PRIu32" samples in AAC frame not supported\n", hdr.samples);
+               "%"PRIu32" samples in AAC frame not supported\n", samples);
         return AVERROR(EINVAL);
     }
     //TODO Data type dependent info (LC profile/SBR)
-- 
2.1.4

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to