Commit b9d3def9 authored by James Almer's avatar James Almer

Merge commit 'b5f19f74'

* commit 'b5f19f74':
  aac: Split function to parse ADTS header data into public and private part
Merged-by: 's avatarJames Almer <jamrial@gmail.com>
parents ff173ce8 b5f19f74
...@@ -2135,6 +2135,7 @@ HAVE_LIST=" ...@@ -2135,6 +2135,7 @@ HAVE_LIST="
CONFIG_EXTRA=" CONFIG_EXTRA="
aandcttables aandcttables
ac3dsp ac3dsp
adts_header
audio_frame_queue audio_frame_queue
audiodsp audiodsp
blockdsp blockdsp
...@@ -2421,7 +2422,7 @@ vc1dsp_select="h264chroma qpeldsp startcode" ...@@ -2421,7 +2422,7 @@ vc1dsp_select="h264chroma qpeldsp startcode"
rdft_select="fft" rdft_select="fft"
# decoders / encoders # decoders / encoders
aac_decoder_select="mdct15 mdct sinewin" aac_decoder_select="adts_header mdct15 mdct sinewin"
aac_fixed_decoder_select="mdct sinewin" aac_fixed_decoder_select="mdct sinewin"
aac_encoder_select="audio_frame_queue iirfilter lpc mdct sinewin" aac_encoder_select="audio_frame_queue iirfilter lpc mdct sinewin"
aac_latm_decoder_select="aac_decoder aac_latm_parser" aac_latm_decoder_select="aac_decoder aac_latm_parser"
...@@ -2873,6 +2874,7 @@ vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m" ...@@ -2873,6 +2874,7 @@ vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m"
wmv3_crystalhd_decoder_select="crystalhd" wmv3_crystalhd_decoder_select="crystalhd"
# parsers # parsers
aac_parser_select="adts_header"
h264_parser_select="golomb h264dsp h264parse" h264_parser_select="golomb h264dsp h264parse"
hevc_parser_select="hevcparse" hevc_parser_select="hevcparse"
mpegaudio_parser_select="mpegaudioheader" mpegaudio_parser_select="mpegaudioheader"
...@@ -2881,6 +2883,7 @@ mpeg4video_parser_select="h263dsp mpegvideo qpeldsp" ...@@ -2881,6 +2883,7 @@ mpeg4video_parser_select="h263dsp mpegvideo qpeldsp"
vc1_parser_select="vc1dsp" vc1_parser_select="vc1dsp"
# bitstream_filters # bitstream_filters
aac_adtstoasc_bsf_select="adts_header"
h264_metadata_bsf_select="cbs_h264" h264_metadata_bsf_select="cbs_h264"
h264_redundant_pps_bsf_select="cbs_h264" h264_redundant_pps_bsf_select="cbs_h264"
hevc_metadata_bsf_select="cbs_h265" hevc_metadata_bsf_select="cbs_h265"
...@@ -3047,7 +3050,8 @@ sap_demuxer_select="sdp_demuxer" ...@@ -3047,7 +3050,8 @@ sap_demuxer_select="sdp_demuxer"
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain" sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
sdp_demuxer_select="rtpdec" sdp_demuxer_select="rtpdec"
smoothstreaming_muxer_select="ismv_muxer" smoothstreaming_muxer_select="ismv_muxer"
spdif_muxer_select="aac_parser" spdif_demuxer_select="adts_header"
spdif_muxer_select="adts_header"
spx_muxer_select="ogg_muxer" spx_muxer_select="ogg_muxer"
swf_demuxer_suggest="zlib" swf_demuxer_suggest="zlib"
tak_demuxer_select="tak_parser" tak_demuxer_select="tak_parser"
......
...@@ -184,7 +184,7 @@ e.g. @samp{ff_w64_demuxer}. ...@@ -184,7 +184,7 @@ e.g. @samp{ff_w64_demuxer}.
@item @item
For variables and functions visible outside of file scope, used internally For variables and functions visible outside of file scope, used internally
across multiple libraries, use @code{avpriv_} as prefix, for example, across multiple libraries, use @code{avpriv_} as prefix, for example,
@samp{avpriv_aac_parse_header}. @samp{avpriv_report_missing_feature}.
@item @item
Each library has its own prefix for public symbols, in addition to the Each library has its own prefix for public symbols, in addition to the
......
...@@ -2,6 +2,7 @@ NAME = avcodec ...@@ -2,6 +2,7 @@ NAME = avcodec
DESC = FFmpeg codec library DESC = FFmpeg codec library
HEADERS = ac3_parser.h \ HEADERS = ac3_parser.h \
adts_parser.h \
avcodec.h \ avcodec.h \
avdct.h \ avdct.h \
avfft.h \ avfft.h \
...@@ -20,6 +21,7 @@ HEADERS = ac3_parser.h \ ...@@ -20,6 +21,7 @@ HEADERS = ac3_parser.h \
xvmc.h \ xvmc.h \
OBJS = ac3_parser.o \ OBJS = ac3_parser.o \
adts_parser.o \
allcodecs.o \ allcodecs.o \
avdct.o \ avdct.o \
avpacket.o \ avpacket.o \
...@@ -52,6 +54,7 @@ OBJS = ac3_parser.o \ ...@@ -52,6 +54,7 @@ OBJS = ac3_parser.o \
# subsystems # subsystems
OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o
OBJS-$(CONFIG_AC3DSP) += ac3dsp.o ac3.o ac3tab.o OBJS-$(CONFIG_AC3DSP) += ac3dsp.o ac3.o ac3tab.o
OBJS-$(CONFIG_ADTS_HEADER) += adts_header.o mpeg4audio.o
OBJS-$(CONFIG_AUDIO_FRAME_QUEUE) += audio_frame_queue.o OBJS-$(CONFIG_AUDIO_FRAME_QUEUE) += audio_frame_queue.o
OBJS-$(CONFIG_AUDIODSP) += audiodsp.o OBJS-$(CONFIG_AUDIODSP) += audiodsp.o
OBJS-$(CONFIG_BLOCKDSP) += blockdsp.o OBJS-$(CONFIG_BLOCKDSP) += blockdsp.o
...@@ -148,10 +151,10 @@ OBJS-$(CONFIG_ZERO12V_DECODER) += 012v.o ...@@ -148,10 +151,10 @@ OBJS-$(CONFIG_ZERO12V_DECODER) += 012v.o
OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o
OBJS-$(CONFIG_A64MULTI5_ENCODER) += a64multienc.o elbg.o OBJS-$(CONFIG_A64MULTI5_ENCODER) += a64multienc.o elbg.o
OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps_float.o \ OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps_float.o \
aacadtsdec.o mpeg4audio.o kbdwin.o \ mpeg4audio.o kbdwin.o \
sbrdsp.o aacpsdsp_float.o cbrt_data.o sbrdsp.o aacpsdsp_float.o cbrt_data.o
OBJS-$(CONFIG_AAC_FIXED_DECODER) += aacdec_fixed.o aactab.o aacsbr_fixed.o aacps_fixed.o \ OBJS-$(CONFIG_AAC_FIXED_DECODER) += aacdec_fixed.o aactab.o aacsbr_fixed.o aacps_fixed.o \
aacadtsdec.o mpeg4audio.o kbdwin.o \ mpeg4audio.o kbdwin.o \
sbrdsp_fixed.o aacpsdsp_fixed.o cbrt_data_fixed.o sbrdsp_fixed.o aacpsdsp_fixed.o cbrt_data_fixed.o
OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o aacenctab.o \ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o aacenctab.o \
aacpsy.o aactab.o \ aacpsy.o aactab.o \
...@@ -880,7 +883,6 @@ OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o ...@@ -880,7 +883,6 @@ OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o
OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
OBJS-$(CONFIG_NUT_DEMUXER) += mpegaudiodata.o mpeg4audio.o OBJS-$(CONFIG_NUT_DEMUXER) += mpegaudiodata.o mpeg4audio.o
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o
OBJS-$(CONFIG_SPDIF_MUXER) += dca.o OBJS-$(CONFIG_SPDIF_MUXER) += dca.o
OBJS-$(CONFIG_TAK_DEMUXER) += tak.o OBJS-$(CONFIG_TAK_DEMUXER) += tak.o
OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o
...@@ -957,7 +959,7 @@ OBJS-$(CONFIG_LIBZVBI_TELETEXT_DECODER) += libzvbi-teletextdec.o ass.o ...@@ -957,7 +959,7 @@ OBJS-$(CONFIG_LIBZVBI_TELETEXT_DECODER) += libzvbi-teletextdec.o ass.o
# parsers # parsers
OBJS-$(CONFIG_AAC_LATM_PARSER) += latm_parser.o OBJS-$(CONFIG_AAC_LATM_PARSER) += latm_parser.o
OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_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_AC3_PARSER) += ac3tab.o aac_ac3_parser.o
OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o
OBJS-$(CONFIG_BMP_PARSER) += bmp_parser.o OBJS-$(CONFIG_BMP_PARSER) += bmp_parser.o
...@@ -1003,8 +1005,7 @@ OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o ...@@ -1003,8 +1005,7 @@ OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o
OBJS-$(CONFIG_XMA_PARSER) += xma_parser.o OBJS-$(CONFIG_XMA_PARSER) += xma_parser.o
# bitstream filters # bitstream filters
OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += aac_adtstoasc_bsf.o aacadtsdec.o \ OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += aac_adtstoasc_bsf.o mpeg4audio.o
mpeg4audio.o
OBJS-$(CONFIG_CHOMP_BSF) += chomp_bsf.o OBJS-$(CONFIG_CHOMP_BSF) += chomp_bsf.o
OBJS-$(CONFIG_DUMP_EXTRADATA_BSF) += dump_extradata_bsf.o OBJS-$(CONFIG_DUMP_EXTRADATA_BSF) += dump_extradata_bsf.o
OBJS-$(CONFIG_DCA_CORE_BSF) += dca_core_bsf.o OBJS-$(CONFIG_DCA_CORE_BSF) += dca_core_bsf.o
......
...@@ -19,8 +19,9 @@ ...@@ -19,8 +19,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "adts_header.h"
#include "adts_parser.h"
#include "avcodec.h" #include "avcodec.h"
#include "aacadtsdec.h"
#include "bsf.h" #include "bsf.h"
#include "put_bits.h" #include "put_bits.h"
#include "get_bits.h" #include "get_bits.h"
...@@ -52,12 +53,12 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *out) ...@@ -52,12 +53,12 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *out)
if (bsfc->par_in->extradata && in->size >= 2 && (AV_RB16(in->data) >> 4) != 0xfff) if (bsfc->par_in->extradata && in->size >= 2 && (AV_RB16(in->data) >> 4) != 0xfff)
goto finish; goto finish;
if (in->size < AAC_ADTS_HEADER_SIZE) if (in->size < AV_AAC_ADTS_HEADER_SIZE)
goto packet_too_small; goto packet_too_small;
init_get_bits(&gb, in->data, AAC_ADTS_HEADER_SIZE * 8); init_get_bits(&gb, in->data, AV_AAC_ADTS_HEADER_SIZE * 8);
if (avpriv_aac_parse_header(&gb, &hdr) < 0) { if (ff_adts_header_parse(&gb, &hdr) < 0) {
av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n"); av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
ret = AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
goto fail; goto fail;
...@@ -70,10 +71,10 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *out) ...@@ -70,10 +71,10 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *out)
goto fail; goto fail;
} }
in->size -= AAC_ADTS_HEADER_SIZE + 2 * !hdr.crc_absent; in->size -= AV_AAC_ADTS_HEADER_SIZE + 2 * !hdr.crc_absent;
if (in->size <= 0) if (in->size <= 0)
goto packet_too_small; goto packet_too_small;
in->data += AAC_ADTS_HEADER_SIZE + 2 * !hdr.crc_absent; in->data += AV_AAC_ADTS_HEADER_SIZE + 2 * !hdr.crc_absent;
if (!ctx->first_frame_done) { if (!ctx->first_frame_done) {
int pce_size = 0; int pce_size = 0;
......
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
#include "parser.h" #include "parser.h"
#include "aac_ac3_parser.h" #include "aac_ac3_parser.h"
#include "aacadtsdec.h" #include "adts_header.h"
#include "adts_parser.h"
#include "get_bits.h" #include "get_bits.h"
#include "mpeg4audio.h" #include "mpeg4audio.h"
...@@ -38,9 +39,10 @@ static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info, ...@@ -38,9 +39,10 @@ static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
} tmp; } tmp;
tmp.u64 = av_be2ne64(state); tmp.u64 = av_be2ne64(state);
init_get_bits(&bits, tmp.u8+8-AAC_ADTS_HEADER_SIZE, AAC_ADTS_HEADER_SIZE * 8); init_get_bits(&bits, tmp.u8 + 8 - AV_AAC_ADTS_HEADER_SIZE,
AV_AAC_ADTS_HEADER_SIZE * 8);
if ((size = avpriv_aac_parse_header(&bits, &hdr)) < 0) if ((size = ff_adts_header_parse(&bits, &hdr)) < 0)
return 0; return 0;
*need_next_header = 0; *need_next_header = 0;
*new_frame_start = 1; *new_frame_start = 1;
...@@ -54,7 +56,7 @@ static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info, ...@@ -54,7 +56,7 @@ static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
static av_cold int aac_parse_init(AVCodecParserContext *s1) static av_cold int aac_parse_init(AVCodecParserContext *s1)
{ {
AACAC3ParseContext *s = s1->priv_data; AACAC3ParseContext *s = s1->priv_data;
s->header_size = AAC_ADTS_HEADER_SIZE; s->header_size = AV_AAC_ADTS_HEADER_SIZE;
s->sync = aac_sync; s->sync = aac_sync;
return 0; return 0;
} }
......
...@@ -50,11 +50,11 @@ ...@@ -50,11 +50,11 @@
#include "aac.h" #include "aac.h"
#include "aactab.h" #include "aactab.h"
#include "aacdectab.h" #include "aacdectab.h"
#include "adts_header.h"
#include "cbrt_data.h" #include "cbrt_data.h"
#include "sbr.h" #include "sbr.h"
#include "aacsbr.h" #include "aacsbr.h"
#include "mpeg4audio.h" #include "mpeg4audio.h"
#include "aacadtsdec.h"
#include "profiles.h" #include "profiles.h"
#include "libavutil/intfloat.h" #include "libavutil/intfloat.h"
......
...@@ -75,11 +75,11 @@ ...@@ -75,11 +75,11 @@
#include "aac.h" #include "aac.h"
#include "aactab.h" #include "aactab.h"
#include "aacdectab.h" #include "aacdectab.h"
#include "adts_header.h"
#include "cbrt_data.h" #include "cbrt_data.h"
#include "sbr.h" #include "sbr.h"
#include "aacsbr.h" #include "aacsbr.h"
#include "mpeg4audio.h" #include "mpeg4audio.h"
#include "aacadtsdec.h"
#include "profiles.h" #include "profiles.h"
#include "libavutil/intfloat.h" #include "libavutil/intfloat.h"
......
...@@ -2955,7 +2955,7 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb) ...@@ -2955,7 +2955,7 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
uint8_t layout_map[MAX_ELEM_ID*4][3]; uint8_t layout_map[MAX_ELEM_ID*4][3];
int layout_map_tags, ret; int layout_map_tags, ret;
size = avpriv_aac_parse_header(gb, &hdr_info); size = ff_adts_header_parse(gb, &hdr_info);
if (size > 0) { if (size > 0) {
if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) { if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) {
// This is 2 for "VLB " audio in NSV files. // This is 2 for "VLB " audio in NSV files.
......
...@@ -22,11 +22,12 @@ ...@@ -22,11 +22,12 @@
*/ */
#include "aac_ac3_parser.h" #include "aac_ac3_parser.h"
#include "aacadtsdec.h" #include "adts_header.h"
#include "adts_parser.h"
#include "get_bits.h" #include "get_bits.h"
#include "mpeg4audio.h" #include "mpeg4audio.h"
int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr) int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
{ {
int size, rdb, ch, sr; int size, rdb, ch, sr;
int aot, crc_abs; int aot, crc_abs;
...@@ -51,7 +52,7 @@ int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr) ...@@ -51,7 +52,7 @@ int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
skip_bits1(gbc); /* copyright_identification_bit */ skip_bits1(gbc); /* copyright_identification_bit */
skip_bits1(gbc); /* copyright_identification_start */ skip_bits1(gbc); /* copyright_identification_start */
size = get_bits(gbc, 13); /* aac_frame_length */ size = get_bits(gbc, 13); /* aac_frame_length */
if (size < AAC_ADTS_HEADER_SIZE) if (size < AV_AAC_ADTS_HEADER_SIZE)
return AAC_AC3_PARSE_ERROR_FRAME_SIZE; return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
skip_bits(gbc, 11); /* adts_buffer_fullness */ skip_bits(gbc, 11); /* adts_buffer_fullness */
......
...@@ -20,14 +20,11 @@ ...@@ -20,14 +20,11 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef AVCODEC_AACADTSDEC_H #ifndef AVCODEC_ADTS_HEADER_H
#define AVCODEC_AACADTSDEC_H #define AVCODEC_ADTS_HEADER_H
#include <stdint.h>
#include "get_bits.h" #include "get_bits.h"
#define AAC_ADTS_HEADER_SIZE 7
typedef struct AACADTSHeaderInfo { typedef struct AACADTSHeaderInfo {
uint32_t sample_rate; uint32_t sample_rate;
uint32_t samples; uint32_t samples;
...@@ -40,7 +37,6 @@ typedef struct AACADTSHeaderInfo { ...@@ -40,7 +37,6 @@ typedef struct AACADTSHeaderInfo {
} AACADTSHeaderInfo; } AACADTSHeaderInfo;
/** /**
* Parse AAC frame header.
* Parse the ADTS frame header to the end of the variable header, which is * Parse the ADTS frame header to the end of the variable header, which is
* the first 54 bits. * the first 54 bits.
* @param[in] gbc BitContext containing the first 54 bits of the frame. * @param[in] gbc BitContext containing the first 54 bits of the frame.
...@@ -49,6 +45,6 @@ typedef struct AACADTSHeaderInfo { ...@@ -49,6 +45,6 @@ typedef struct AACADTSHeaderInfo {
* -2 if the version element is invalid, -3 if the sample rate * -2 if the version element is invalid, -3 if the sample rate
* element is invalid, or -4 if the bit rate element is invalid. * element is invalid, or -4 if the bit rate element is invalid.
*/ */
int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr); int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr);
#endif /* AVCODEC_AACADTSDEC_H */ #endif /* AVCODEC_ADTS_HEADER_H */
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include <stddef.h>
#include <stdint.h>
#include "adts_header.h"
#include "adts_parser.h"
int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames)
{
#if CONFIG_ADTS_HEADER
GetBitContext gb;
AACADTSHeaderInfo hdr;
int err = init_get_bits8(&gb, buf, AV_AAC_ADTS_HEADER_SIZE);
if (err < 0)
return err;
err = ff_adts_header_parse(&gb, &hdr);
if (err < 0)
return err;
*samples = hdr.samples;
*frames = hdr.num_aac_frames;
return 0;
#else
return AVERROR(ENOSYS);
#endif
}
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_ADTS_PARSER_H
#define AVCODEC_ADTS_PARSER_H
#include <stddef.h>
#include <stdint.h>
#define AV_AAC_ADTS_HEADER_SIZE 7
/**
* 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 av_adts_header_parse(const uint8_t *buf, uint32_t *samples,
uint8_t *frames);
#endif /* AVCODEC_ADTS_PARSER_H */
...@@ -25,18 +25,22 @@ ...@@ -25,18 +25,22 @@
* @author Anssi Hannula * @author Anssi Hannula
*/ */
#include "libavutil/bswap.h"
#include "libavcodec/ac3.h"
#include "libavcodec/adts_parser.h"
#include "avformat.h" #include "avformat.h"
#include "spdif.h" #include "spdif.h"
#include "libavcodec/ac3.h"
#include "libavcodec/aacadtsdec.h"
static int spdif_get_offset_and_codec(AVFormatContext *s, static int spdif_get_offset_and_codec(AVFormatContext *s,
enum IEC61937DataType data_type, enum IEC61937DataType data_type,
const char *buf, int *offset, const char *buf, int *offset,
enum AVCodecID *codec) enum AVCodecID *codec)
{ {
AACADTSHeaderInfo aac_hdr; uint32_t samples;
GetBitContext gbc; uint8_t frames;
int ret;
switch (data_type & 0xff) { switch (data_type & 0xff) {
case IEC61937_AC3: case IEC61937_AC3:
...@@ -56,13 +60,13 @@ static int spdif_get_offset_and_codec(AVFormatContext *s, ...@@ -56,13 +60,13 @@ static int spdif_get_offset_and_codec(AVFormatContext *s,
*codec = AV_CODEC_ID_MP3; *codec = AV_CODEC_ID_MP3;
break; break;
case IEC61937_MPEG2_AAC: case IEC61937_MPEG2_AAC:
init_get_bits(&gbc, buf, AAC_ADTS_HEADER_SIZE * 8); ret = av_adts_header_parse(buf, &samples, &frames);
if (avpriv_aac_parse_header(&gbc, &aac_hdr) < 0) { if (ret < 0) {
if (s) /* be silent during a probe */ if (s) /* be silent during a probe */
av_log(s, AV_LOG_ERROR, "Invalid AAC packet in IEC 61937\n"); 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; *codec = AV_CODEC_ID_AAC;
break; break;
case IEC61937_MPEG2_LAYER1_LSF: case IEC61937_MPEG2_LAYER1_LSF:
...@@ -100,7 +104,7 @@ static int spdif_get_offset_and_codec(AVFormatContext *s, ...@@ -100,7 +104,7 @@ static int spdif_get_offset_and_codec(AVFormatContext *s,
} }
/* Largest offset between bursts we currently handle, i.e. AAC with /* Largest offset between bursts we currently handle, i.e. AAC with
aac_hdr.samples = 4096 */ samples = 4096 */
#define SPDIF_MAX_OFFSET 16384 #define SPDIF_MAX_OFFSET 16384
static int spdif_probe(AVProbeData *p) static int spdif_probe(AVProbeData *p)
...@@ -132,7 +136,7 @@ int ff_spdif_probe(const uint8_t *p_buf, int buf_size, enum AVCodecID *codec) ...@@ -132,7 +136,7 @@ int ff_spdif_probe(const uint8_t *p_buf, int buf_size, enum AVCodecID *codec)
} else } else
consecutive_codes = 0; consecutive_codes = 0;
if (buf + 4 + AAC_ADTS_HEADER_SIZE > p_buf + buf_size) if (buf + 4 + AV_AAC_ADTS_HEADER_SIZE > p_buf + buf_size)
break; break;
/* continue probing to find more sync codes */ /* continue probing to find more sync codes */
......
...@@ -50,9 +50,9 @@ ...@@ -50,9 +50,9 @@
#include "avio_internal.h" #include "avio_internal.h"
#include "spdif.h" #include "spdif.h"
#include "libavcodec/ac3.h" #include "libavcodec/ac3.h"
#include "libavcodec/adts_parser.h"
#include "libavcodec/dca.h" #include "libavcodec/dca.h"
#include "libavcodec/dca_syncwords.h" #include "libavcodec/dca_syncwords.h"
#include "libavcodec/aacadtsdec.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
typedef struct IEC61937Context { typedef struct IEC61937Context {
...@@ -349,19 +349,18 @@ static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt) ...@@ -349,19 +349,18 @@ static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt) static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
{ {
IEC61937Context *ctx = s->priv_data; IEC61937Context *ctx = s->priv_data;
AACADTSHeaderInfo hdr; uint32_t samples;
GetBitContext gbc; uint8_t frames;
int ret; int ret;
init_get_bits(&gbc, pkt->data, AAC_ADTS_HEADER_SIZE * 8); ret = av_adts_header_parse(pkt->data, &samples, &frames);
ret = avpriv_aac_parse_header(&gbc, &hdr);
if (ret < 0) { if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Wrong AAC file format\n"); av_log(s, AV_LOG_ERROR, "Wrong AAC file format\n");
return AVERROR_INVALIDDATA; return ret;
} }
ctx->pkt_offset = hdr.samples << 2; ctx->pkt_offset = samples << 2;
switch (hdr.num_aac_frames) { switch (frames) {
case 1: case 1:
ctx->data_type = IEC61937_MPEG2_AAC; ctx->data_type = IEC61937_MPEG2_AAC;
break; break;
...@@ -373,7 +372,7 @@ static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt) ...@@ -373,7 +372,7 @@ static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
break; break;
default: default:
av_log(s, AV_LOG_ERROR, 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); return AVERROR(EINVAL);
} }
//TODO Data type dependent info (LC profile/SBR) //TODO Data type dependent info (LC profile/SBR)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment