On 2012-01-09 14:40:01 -0500, Justin Ruggles wrote:
> The WAVE demuxer returns packets with many blocks per frame, which needs to be
> parsed into single blocks. This has a side-effect of fixing the timestamps.
> ---
>  Changelog                    |    1 +
>  libavcodec/Makefile          |    1 +
>  libavcodec/allcodecs.c       |    1 +
>  libavcodec/gsm.h             |   31 ++++++++++++++++
>  libavcodec/gsm_parser.c      |   79 
> ++++++++++++++++++++++++++++++++++++++++++
>  libavcodec/gsmdec_data.h     |    5 ---
>  libavcodec/gsmdec_template.c |    1 +
>  libavcodec/libgsm.c          |    7 +---
>  libavcodec/msgsmdec.c        |    1 +
>  libavcodec/version.h         |    2 +-
>  10 files changed, 118 insertions(+), 11 deletions(-)
>  create mode 100644 libavcodec/gsm.h
>  create mode 100644 libavcodec/gsm_parser.c
> 
> diff --git a/Changelog b/Changelog
> index b098203..ac8b94e 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -5,6 +5,7 @@ releases are sorted from youngest to oldest.
>  version <next>:
>  
>  - Automatic thread count based on detection number of (available) CPU cores
> +- GSM audio parser
>  
>  
>  version 0.8_beta1:
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 741df91..1e8d09b 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -608,6 +608,7 @@ OBJS-$(CONFIG_DNXHD_PARSER)            += dnxhd_parser.o
>  OBJS-$(CONFIG_DVBSUB_PARSER)           += dvbsub_parser.o
>  OBJS-$(CONFIG_DVDSUB_PARSER)           += dvdsub_parser.o
>  OBJS-$(CONFIG_FLAC_PARSER)             += flac_parser.o flacdata.o flac.o
> +OBJS-$(CONFIG_GSM_PARSER)              += gsm_parser.o
>  OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
>  OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
>  OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264.o            \
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index 3980982..5289692 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -399,6 +399,7 @@ void avcodec_register_all(void)
>      REGISTER_PARSER  (DVBSUB, dvbsub);
>      REGISTER_PARSER  (DVDSUB, dvdsub);
>      REGISTER_PARSER  (FLAC, flac);
> +    REGISTER_PARSER  (GSM, gsm);
>      REGISTER_PARSER  (H261, h261);
>      REGISTER_PARSER  (H263, h263);
>      REGISTER_PARSER  (H264, h264);
> diff --git a/libavcodec/gsm.h b/libavcodec/gsm.h
> new file mode 100644
> index 0000000..c7c3e22
> --- /dev/null
> +++ b/libavcodec/gsm.h
> @@ -0,0 +1,31 @@
> +/*
> + * GSM common header
> + *
> + * This file is part of Libav.
> + *
> + * Libav 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.
> + *
> + * Libav 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 Libav; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
> USA
> + */
> +
> +#ifndef AVCODEC_GSM_H
> +#define AVCODEC_GSM_H
> +
> +/* bytes per block */
> +#define GSM_BLOCK_SIZE    33
> +#define GSM_MS_BLOCK_SIZE 65
> +
> +/* samples per block */
> +#define GSM_FRAME_SIZE 160
> +
> +#endif /* AVCODEC_GSM_H */
> diff --git a/libavcodec/gsm_parser.c b/libavcodec/gsm_parser.c
> new file mode 100644
> index 0000000..a2965d3
> --- /dev/null
> +++ b/libavcodec/gsm_parser.c
> @@ -0,0 +1,79 @@
> +/*
> + * Copyright (c) 2012  Justin Ruggles
> + *
> + * This file is part of Libav.
> + *
> + * Libav 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.
> + *
> + * Libav 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 Libav; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
> USA
> + */
> +
> +/**
> + * @file
> + * GSM audio parser
> + *
> + * Splits packets into individual blocks.
> + */
> +
> +#include "parser.h"
> +#include "gsm.h"
> +
> +typedef struct GSMParseContext {
> +    ParseContext pc;
> +    int block_size;
> +    int remaining;
> +} GSMParseContext;
> +
> +static int gsm_parse(AVCodecParserContext *s1, AVCodecContext *avctx,
> +                     const uint8_t **poutbuf, int *poutbuf_size,
> +                     const uint8_t *buf, int buf_size)
> +{
> +    GSMParseContext *s = s1->priv_data;
> +    ParseContext *pc = &s->pc;
> +    int next;
> +
> +    if (!s->block_size) {
> +        switch (avctx->codec_id) {
> +        case CODEC_ID_GSM:    s->block_size = GSM_BLOCK_SIZE;    break;
> +        case CODEC_ID_GSM_MS: s->block_size = GSM_MS_BLOCK_SIZE; break;
> +        default:
> +            return AVERROR(EINVAL);
> +        }
> +    }
> +
> +    if (!s->remaining)
> +        s->remaining = s->block_size;
> +    if (s->remaining <= buf_size) {
> +        next = s->remaining;
> +        s->remaining = 0;
> +    } else {
> +        next = END_NOT_FOUND;
> +        s->remaining -= buf_size;
> +    }
> +
> +    if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) {
> +        *poutbuf      = NULL;
> +        *poutbuf_size = 0;
> +        return buf_size;
> +    }
> +    *poutbuf      = buf;
> +    *poutbuf_size = buf_size;
> +    return next;
> +}
> +
> +AVCodecParser ff_gsm_parser = {
> +    .codec_ids      = { CODEC_ID_GSM, CODEC_ID_GSM_MS },
> +    .priv_data_size = sizeof(GSMParseContext),
> +    .parser_parse   = gsm_parse,
> +    .parser_close   = ff_parse_close,
> +};
> diff --git a/libavcodec/gsmdec_data.h b/libavcodec/gsmdec_data.h
> index 21789f7..2ff2322 100644
> --- a/libavcodec/gsmdec_data.h
> +++ b/libavcodec/gsmdec_data.h
> @@ -25,11 +25,6 @@
>  #include <stdint.h>
>  #include "avcodec.h"
>  
> -// input and output sizes in byte
> -#define GSM_BLOCK_SIZE    33
> -#define GSM_MS_BLOCK_SIZE 65
> -#define GSM_FRAME_SIZE   160
> -
>  typedef struct {
>      AVFrame frame;
>      // Contains first 120 elements from the previous frame
> diff --git a/libavcodec/gsmdec_template.c b/libavcodec/gsmdec_template.c
> index 7e57c71..b5222af 100644
> --- a/libavcodec/gsmdec_template.c
> +++ b/libavcodec/gsmdec_template.c
> @@ -25,6 +25,7 @@
>   */
>  
>  #include "get_bits.h"
> +#include "gsm.h"
>  #include "gsmdec_data.h"
>  
>  static void apcm_dequant_add(GetBitContext *gb, int16_t *dst)
> diff --git a/libavcodec/libgsm.c b/libavcodec/libgsm.c
> index 16d9972..1fa04cf 100644
> --- a/libavcodec/libgsm.c
> +++ b/libavcodec/libgsm.c
> @@ -27,13 +27,10 @@
>  
>  // The idiosyncrasies of GSM-in-WAV are explained at 
> http://kbs.cs.tu-berlin.de/~jutta/toast.html
>  
> -#include "avcodec.h"
>  #include <gsm/gsm.h>
>  
> -// gsm.h misses some essential constants
> -#define GSM_BLOCK_SIZE 33
> -#define GSM_MS_BLOCK_SIZE 65
> -#define GSM_FRAME_SIZE 160
> +#include "avcodec.h"
> +#include "gsm.h"
>  
>  static av_cold int libgsm_encode_init(AVCodecContext *avctx) {
>      if (avctx->channels > 1) {
> diff --git a/libavcodec/msgsmdec.c b/libavcodec/msgsmdec.c
> index 1a288ee..52b0f5d 100644
> --- a/libavcodec/msgsmdec.c
> +++ b/libavcodec/msgsmdec.c
> @@ -22,6 +22,7 @@
>  #define BITSTREAM_READER_LE
>  #include "avcodec.h"
>  #include "msgsmdec.h"
> +#include "gsm.h"
>  #include "gsmdec_template.c"
>  
>  int ff_msgsm_decode_block(AVCodecContext *avctx, int16_t *samples,
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 1317ef0..888bdf8 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -21,7 +21,7 @@
>  #define AVCODEC_VERSION_H
>  
>  #define LIBAVCODEC_VERSION_MAJOR 53
> -#define LIBAVCODEC_VERSION_MINOR 32
> +#define LIBAVCODEC_VERSION_MINOR 33
>  #define LIBAVCODEC_VERSION_MICRO  2

reset micro before pushing

looks good otherwise although parser

JAnne

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to