On Tue, Aug 11, 2015 at 12:00 PM, Michael Niedermayer <mich...@niedermayer.cc> wrote: > On Tue, Aug 11, 2015 at 11:21:22AM -0400, Ganesh Ajjanagadde wrote: >> On Tue, Aug 11, 2015 at 11:02 AM, Michael Niedermayer >> <mich...@niedermayer.cc> wrote: >> > On Mon, Aug 10, 2015 at 09:51:43PM -0400, Ganesh Ajjanagadde wrote: >> >> Add trivial g729 parser; fixes Ticket4753 >> >> >> >> Signed-off-by: Ganesh Ajjanagadde <gajjanaga...@gmail.com> >> >> --- >> >> libavcodec/Makefile | 1 + >> >> libavcodec/allcodecs.c | 1 + >> >> libavcodec/g729.h | 4 +++ >> >> libavcodec/g729_parser.c | 90 >> >> ++++++++++++++++++++++++++++++++++++++++++++++++ >> >> 4 files changed, 96 insertions(+) >> >> create mode 100644 libavcodec/g729_parser.c >> >> >> >> diff --git a/libavcodec/Makefile b/libavcodec/Makefile >> >> index e61b9cd..31b8ceb 100644 >> >> --- a/libavcodec/Makefile >> >> +++ b/libavcodec/Makefile >> >> @@ -847,6 +847,7 @@ OBJS-$(CONFIG_DVD_NAV_PARSER) += >> >> dvd_nav_parser.o >> >> OBJS-$(CONFIG_DVDSUB_PARSER) += dvdsub_parser.o >> >> OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o >> >> flac.o \ >> >> vorbis_data.o >> >> +OBJS-$(CONFIG_G729_PARSER) += g729_parser.o >> >> OBJS-$(CONFIG_GSM_PARSER) += gsm_parser.o >> >> OBJS-$(CONFIG_H261_PARSER) += h261_parser.o >> >> OBJS-$(CONFIG_H263_PARSER) += h263_parser.o >> >> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c >> >> index ed0975e..04a83d4 100644 >> >> --- a/libavcodec/allcodecs.c >> >> +++ b/libavcodec/allcodecs.c >> >> @@ -602,6 +602,7 @@ void avcodec_register_all(void) >> >> REGISTER_PARSER(DVDSUB, dvdsub); >> >> REGISTER_PARSER(DVD_NAV, dvd_nav); >> >> REGISTER_PARSER(FLAC, flac); >> >> + REGISTER_PARSER(G729, g729); >> >> REGISTER_PARSER(GSM, gsm); >> >> REGISTER_PARSER(H261, h261); >> >> REGISTER_PARSER(H263, h263); >> >> diff --git a/libavcodec/g729.h b/libavcodec/g729.h >> >> index 6168313..7c5f693 100644 >> >> --- a/libavcodec/g729.h >> >> +++ b/libavcodec/g729.h >> >> @@ -26,4 +26,8 @@ >> >> */ >> >> #define SUBFRAME_SIZE 40 >> >> >> >> +/* bytes per block */ >> >> +#define G729_8K_BLOCK_SIZE 10 >> >> +#define G729D_6K4_BLOCK_SIZE 8 >> >> + >> >> #endif // AVCODEC_G729_H >> >> diff --git a/libavcodec/g729_parser.c b/libavcodec/g729_parser.c >> >> new file mode 100644 >> >> index 0000000..203c787 >> >> --- /dev/null >> >> +++ b/libavcodec/g729_parser.c >> >> @@ -0,0 +1,90 @@ >> >> +/* >> >> + * Copyright (c) 2015 Ganesh Ajjanagadde >> >> + * >> >> + * 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 >> >> + * G.729 audio parser >> >> + * >> >> + * Splits packets into individual blocks. >> >> + */ >> >> + >> >> +#include "parser.h" >> >> +#include "g729.h" >> >> +#include "g729dec.h" >> >> + >> >> +typedef struct G729ParseContext { >> >> + ParseContext pc; >> >> + int block_size; >> >> + int duration; >> >> + int remaining; >> >> +} G729ParseContext; >> >> + >> >> +static int g729_parse(AVCodecParserContext *s1, AVCodecContext *avctx, >> >> + const uint8_t **poutbuf, int *poutbuf_size, >> >> + const uint8_t *buf, int buf_size) >> >> +{ >> >> + G729ParseContext *s = s1->priv_data; >> >> + ParseContext *pc = &s->pc; >> > >> >> + G729Context *ctx = avctx->priv_data; >> > >> > this is not safe. >> > theres no gurantee that there even is a decoder decoding the output >> > from the parser, there might be none, or 2 or it might be a binary >> > decoder using a different struct, an application can use anything >> > or nothing after a parser >> >> I could move that into the switch block, and do this only after >> confirming the CODEC_ID. >> I do not think this resolves all of the above concerns though. >> Any ideas as to what can be done? >> Basic issue pointed out by Paul is that the parser really has no way of >> knowing >> whether to split into 8 byte or 10 byte chunks. > > the decoder chooses the format based on the buf_size > the buf_size is what the parser returns > the parser uses the decoders format > > there is no way this can work, each just takes the information from > the other but neither knows anything in the first place > even if there was a decoder and even if it was safe to access its > context from the parser. > > The first thing to do is to read any study the specification > are there any fixed bits or invalid values in the bitstream > if so they can possibly be used to identify the packet size by > checking which size leads to packets with no invalid values or bits > occuring over a long enough period > > one also could try to use the bitrate but this too has to be set by > something (like the user for raw and some header from other containers)
Used this method, see updated patch. Thanks. > > [...] > -- > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB > > The greatest way to live with honor in this world is to be what we pretend > to be. -- Socrates > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel