[FFmpeg-devel] [PATCH] Add a parser for DNET (byte-swapped AC3).
Justin Ruggles
justin.ruggles
Thu Mar 3 18:11:05 CET 2011
On 03/03/2011 12:58 AM, Reimar D?ffinger wrote:
> Currently we simply byte-swap DNET directly in the Real demuxer,
> however this is not generally possible/correct since which two bytes we
> need to swap depends on whether the header starts on an even or an odd
> byte.
> Not useful on its own within FFmpeg, but could e.g. be used together
> with a byte-swap bitstream filter or a modified AC3-decoder to implement
> more robust DNET support.
> ---
> libavcodec/ac3_parser.c | 24 ++++++++++++++++++++++++
> libavcodec/allcodecs.c | 1 +
> libavcodec/avcodec.h | 5 +++--
> 3 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/ac3_parser.c b/libavcodec/ac3_parser.c
> index 301aadc..7c72fb4 100644
> --- a/libavcodec/ac3_parser.c
> +++ b/libavcodec/ac3_parser.c
> @@ -169,6 +169,22 @@ static av_cold int ac3_parse_init(AVCodecParserContext *s1)
> return 0;
> }
>
> +static int dnet_sync(uint64_t state, AACAC3ParseContext *hdr_info,
> + int *need_next_header, int *new_frame_start)
> +{
> + // byte-swap and right-shift state
> + state = (state & 0x00ff00ff00ff00ff) |
> + ((state & 0xff00ff00ff00ff00) >> 16);
> + return ac3_sync(state, hdr_info, need_next_header, new_frame_start);
> +}
> +
> +static av_cold int dnet_parse_init(AVCodecParserContext *s1)
> +{
> + AACAC3ParseContext *s = s1->priv_data;
> + s->header_size = 8;
> + s->sync = dnet_sync;
> + return 0;
> +}
Why does s->header_size need to be 8 instead of 7?
>
> AVCodecParser ff_ac3_parser = {
> { CODEC_ID_AC3, CODEC_ID_EAC3 },
> @@ -177,3 +193,11 @@ AVCodecParser ff_ac3_parser = {
> ff_aac_ac3_parse,
> ff_parse_close,
> };
> +
> +AVCodecParser ff_dnet_parser = {
> + { CODEC_ID_DNET },
> + sizeof(AACAC3ParseContext),
> + dnet_parse_init,
> + ff_aac_ac3_parse,
> + ff_parse_close,
> +};
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index 108a3ab..150d258 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -378,6 +378,7 @@ void avcodec_register_all(void)
> REGISTER_PARSER (CAVSVIDEO, cavsvideo);
> REGISTER_PARSER (DCA, dca);
> REGISTER_PARSER (DIRAC, dirac);
> + REGISTER_PARSER (DNET, dnet);
> REGISTER_PARSER (DNXHD, dnxhd);
> REGISTER_PARSER (DVBSUB, dvbsub);
> REGISTER_PARSER (DVDSUB, dvdsub);
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 07c9aad..c835c1a 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -32,8 +32,8 @@
> #include "libavutil/cpu.h"
>
> #define LIBAVCODEC_VERSION_MAJOR 52
> -#define LIBAVCODEC_VERSION_MINOR 113
> -#define LIBAVCODEC_VERSION_MICRO 2
> +#define LIBAVCODEC_VERSION_MINOR 114
> +#define LIBAVCODEC_VERSION_MICRO 0
>
> #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
> LIBAVCODEC_VERSION_MINOR, \
> @@ -390,6 +390,7 @@ enum CodecID {
> CODEC_ID_BINKAUDIO_DCT,
> CODEC_ID_AAC_LATM,
> CODEC_ID_QDMC,
> + CODEC_ID_DNET,
>
> /* subtitle codecs */
> CODEC_ID_DVD_SUBTITLE= 0x17000,
And I still don't like the name CODEC_ID_DNET.
-Justin
More information about the ffmpeg-devel
mailing list