You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.1KB

  1. /*
  2. * Copyright (c) 2013-2014 Mozilla Corporation
  3. *
  4. * This file is part of Libav.
  5. *
  6. * Libav is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * Libav is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with Libav; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. /**
  21. * @file
  22. * Opus parser
  23. *
  24. * Determines the duration for each packet.
  25. */
  26. #include "avcodec.h"
  27. #include "opus.h"
  28. typedef struct OpusParseContext {
  29. OpusContext ctx;
  30. OpusPacket pkt;
  31. int extradata_parsed;
  32. } OpusParseContext;
  33. static int opus_parse(AVCodecParserContext *ctx, AVCodecContext *avctx,
  34. const uint8_t **poutbuf, int *poutbuf_size,
  35. const uint8_t *buf, int buf_size)
  36. {
  37. OpusParseContext *s = ctx->priv_data;
  38. int ret;
  39. if (!buf_size)
  40. return 0;
  41. if (avctx->extradata && !s->extradata_parsed) {
  42. ret = ff_opus_parse_extradata(avctx, &s->ctx);
  43. if (ret < 0) {
  44. av_log(avctx, AV_LOG_ERROR, "Error parsing Ogg extradata.\n");
  45. goto fail;
  46. }
  47. av_freep(&s->ctx.channel_maps);
  48. s->extradata_parsed = 1;
  49. }
  50. ret = ff_opus_parse_packet(&s->pkt, buf, buf_size, s->ctx.nb_streams > 1);
  51. if (ret < 0) {
  52. av_log(avctx, AV_LOG_ERROR, "Error parsing Opus packet header.\n");
  53. goto fail;
  54. }
  55. ctx->duration = s->pkt.frame_count * s->pkt.frame_duration;
  56. fail:
  57. *poutbuf = buf;
  58. *poutbuf_size = buf_size;
  59. return buf_size;
  60. }
  61. AVCodecParser ff_opus_parser = {
  62. .codec_ids = { AV_CODEC_ID_OPUS },
  63. .priv_data_size = sizeof(OpusParseContext),
  64. .parser_parse = opus_parse,
  65. };