From 2edd47582b4db2b89b821d6e809d5a4671487b0e Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Wed, 27 Jan 2016 14:37:09 +0100 Subject: [PATCH] avcodec: add dvaudio parser Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/dvaudio.h | 32 ++++++++++++++++++++++++++ libavcodec/dvaudio_parser.c | 46 +++++++++++++++++++++++++++++++++++++ libavcodec/dvaudiodec.c | 16 +------------ 5 files changed, 81 insertions(+), 15 deletions(-) create mode 100644 libavcodec/dvaudio.h create mode 100644 libavcodec/dvaudio_parser.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 696f699b5c..3f7aa5f238 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -866,6 +866,7 @@ OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o dca.o OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o OBJS-$(CONFIG_DNXHD_PARSER) += dnxhd_parser.o OBJS-$(CONFIG_DPX_PARSER) += dpx_parser.o +OBJS-$(CONFIG_DVAUDIO_PARSER) += dvaudio_parser.o OBJS-$(CONFIG_DVBSUB_PARSER) += dvbsub_parser.o OBJS-$(CONFIG_DVD_NAV_PARSER) += dvd_nav_parser.o OBJS-$(CONFIG_DVDSUB_PARSER) += dvdsub_parser.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 66a57b0652..d55751b0ad 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -621,6 +621,7 @@ void avcodec_register_all(void) REGISTER_PARSER(DIRAC, dirac); REGISTER_PARSER(DNXHD, dnxhd); REGISTER_PARSER(DPX, dpx); + REGISTER_PARSER(DVAUDIO, dvaudio); REGISTER_PARSER(DVBSUB, dvbsub); REGISTER_PARSER(DVDSUB, dvdsub); REGISTER_PARSER(DVD_NAV, dvd_nav); diff --git a/libavcodec/dvaudio.h b/libavcodec/dvaudio.h new file mode 100644 index 0000000000..e4d0df1a3a --- /dev/null +++ b/libavcodec/dvaudio.h @@ -0,0 +1,32 @@ +/* + * 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 + */ + +static inline int dv_get_audio_sample_count(const uint8_t *buffer, int dsf) +{ + int samples = buffer[0] & 0x3f; /* samples in this frame - min samples */ + + switch ((buffer[3] >> 3) & 0x07) { + case 0: + return samples + (dsf ? 1896 : 1580); + case 1: + return samples + (dsf ? 1742 : 1452); + case 2: + default: + return samples + (dsf ? 1264 : 1053); + } +} diff --git a/libavcodec/dvaudio_parser.c b/libavcodec/dvaudio_parser.c new file mode 100644 index 0000000000..160faafdb7 --- /dev/null +++ b/libavcodec/dvaudio_parser.c @@ -0,0 +1,46 @@ +/* + * 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 + */ + +/** + * @file + * Ulead DV audio parser + * + * Determines the duration for each packet. + */ + +#include "parser.h" +#include "dvaudio.h" + +static int dvaudio_parse(AVCodecParserContext *s1, AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size) +{ + if (buf_size >= 248) + s1->duration = dv_get_audio_sample_count(buf + 244, avctx->block_align == 8640); + + /* always return the full packet. this parser isn't doing any splitting or + combining, only packet analysis */ + *poutbuf = buf; + *poutbuf_size = buf_size; + return buf_size; +} + +AVCodecParser ff_dvaudio_parser = { + .codec_ids = { AV_CODEC_ID_DVAUDIO }, + .parser_parse = dvaudio_parse, +}; diff --git a/libavcodec/dvaudiodec.c b/libavcodec/dvaudiodec.c index 0cbc2be48c..faa9e5fb34 100644 --- a/libavcodec/dvaudiodec.c +++ b/libavcodec/dvaudiodec.c @@ -21,6 +21,7 @@ #include "libavutil/intreadwrite.h" #include "avcodec.h" #include "internal.h" +#include "dvaudio.h" typedef struct DVAudioContext { int block_size; @@ -66,21 +67,6 @@ static av_cold int decode_init(AVCodecContext *avctx) return 0; } -static inline int dv_get_audio_sample_count(const uint8_t *buffer, int dsf) -{ - int samples = buffer[0] & 0x3f; /* samples in this frame - min samples */ - - switch ((buffer[3] >> 3) & 0x07) { - case 0: - return samples + (dsf ? 1896 : 1580); - case 1: - return samples + (dsf ? 1742 : 1452); - case 2: - default: - return samples + (dsf ? 1264 : 1053); - } -} - static inline uint16_t dv_audio_12to16(uint16_t sample) { uint16_t shift, result;