On 3/28/18, James Almer <jamr...@gmail.com> wrote: > On 3/28/2018 4:00 PM, Paul B Mahol wrote: >> Signed-off-by: Paul B Mahol <one...@gmail.com> >> --- >> doc/bitstream_filters.texi | 4 +++ >> libavcodec/Makefile | 1 + >> libavcodec/bitstream_filters.c | 1 + >> libavcodec/eac3_core_bsf.c | 80 >> ++++++++++++++++++++++++++++++++++++++++++ >> 4 files changed, 86 insertions(+) >> create mode 100644 libavcodec/eac3_core_bsf.c >> >> diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi >> index 982e3edac8..7322af6550 100644 >> --- a/doc/bitstream_filters.texi >> +++ b/doc/bitstream_filters.texi >> @@ -75,6 +75,10 @@ the header stored in extradata to the key packets: >> ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v >> dump_extra out.ts >> @end example >> >> +@section eac3_core >> + >> +Extract the core from a E-AC-3 stream, dropping extra channels. >> + >> @section extract_extradata >> >> Extract the in-band extradata. >> diff --git a/libavcodec/Makefile b/libavcodec/Makefile >> index aaef6c3ab8..8220ad855d 100644 >> --- a/libavcodec/Makefile >> +++ b/libavcodec/Makefile >> @@ -1041,6 +1041,7 @@ 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_DCA_CORE_BSF) += dca_core_bsf.o >> +OBJS-$(CONFIG_EAC3_CORE_BSF) += eac3_core_bsf.o >> OBJS-$(CONFIG_EXTRACT_EXTRADATA_BSF) += extract_extradata_bsf.o \ >> h2645_parse.o >> OBJS-$(CONFIG_FILTER_UNITS_BSF) += filter_units_bsf.o >> diff --git a/libavcodec/bitstream_filters.c >> b/libavcodec/bitstream_filters.c >> index 12211225bb..18b698a85f 100644 >> --- a/libavcodec/bitstream_filters.c >> +++ b/libavcodec/bitstream_filters.c >> @@ -28,6 +28,7 @@ extern const AVBitStreamFilter ff_aac_adtstoasc_bsf; >> extern const AVBitStreamFilter ff_chomp_bsf; >> extern const AVBitStreamFilter ff_dump_extradata_bsf; >> extern const AVBitStreamFilter ff_dca_core_bsf; >> +extern const AVBitStreamFilter ff_eac3_core_bsf; >> extern const AVBitStreamFilter ff_extract_extradata_bsf; >> extern const AVBitStreamFilter ff_filter_units_bsf; >> extern const AVBitStreamFilter ff_h264_metadata_bsf; >> diff --git a/libavcodec/eac3_core_bsf.c b/libavcodec/eac3_core_bsf.c >> new file mode 100644 >> index 0000000000..85feb2583b >> --- /dev/null >> +++ b/libavcodec/eac3_core_bsf.c >> @@ -0,0 +1,80 @@ >> +/* >> + * Copyright (c) 2018 Paul B Mahol >> + * >> + * 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 "avcodec.h" >> +#include "bsf.h" >> +#include "get_bits.h" >> +#include "libavutil/mem.h" > > Why? > >> +#include "ac3_parser_internal.h" >> + >> +static int eac3_core_filter(AVBSFContext *ctx, AVPacket *pkt) >> +{ >> + AC3HeaderInfo hdr; >> + GetBitContext gbc; >> + int ret; >> + >> + ret = ff_bsf_get_packet_ref(ctx, pkt); >> + if (ret < 0) >> + return ret; >> + ret = init_get_bits8(&gbc, pkt->data, pkt->size); >> + if (ret < 0) >> + return ret; > > av_packet_unref(pkt); > > Same with every other failure below, so maybe doing a goto fail would be > easier. > >> + >> + ret = ff_ac3_parse_header(&gbc, &hdr); >> + if (ret < 0) >> + return AVERROR_INVALIDDATA; >> + >> + if (hdr.frame_type == EAC3_FRAME_TYPE_INDEPENDENT || >> + hdr.frame_type == EAC3_FRAME_TYPE_AC3_CONVERT) { >> + pkt->size = hdr.frame_size; >> + } else if (hdr.frame_type == EAC3_FRAME_TYPE_DEPENDENT && pkt->size > >> hdr.frame_size) { >> + AC3HeaderInfo hdr2; >> + >> + ret = init_get_bits8(&gbc, pkt->data + hdr.frame_size, pkt->size >> - hdr.frame_size); >> + if (ret < 0) >> + return ret; >> + >> + ret = ff_ac3_parse_header(&gbc, &hdr2); >> + if (ret < 0) >> + return AVERROR_INVALIDDATA; >> + >> + if (hdr2.frame_type == EAC3_FRAME_TYPE_INDEPENDENT || >> + hdr2.frame_type == EAC3_FRAME_TYPE_AC3_CONVERT) { >> + pkt->size -= hdr.frame_size; >> + pkt->data += hdr.frame_size; >> + } else { >> + pkt->size = 0; >> + } >> + } else { >> + pkt->size = 0; >> + } >> + >> + return 0; >> +} >> + >> +static const enum AVCodecID codec_ids[] = { >> + AV_CODEC_ID_EAC3, AV_CODEC_ID_NONE, >> +}; >> + >> +const AVBitStreamFilter ff_eac3_core_bsf = { >> + .name = "eac3_core", >> + .filter = eac3_core_filter, >> + .codec_ids = codec_ids, >> +}; >> >
All done. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel