Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * G.723.1 demuxer
  3.  * Copyright (c) 2010 Mohamed Naufal Basheer
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. /**
  23.  * @file
  24.  * G.723.1 demuxer
  25.  */
  26.  
  27. #include "libavutil/attributes.h"
  28. #include "libavutil/channel_layout.h"
  29. #include "avformat.h"
  30. #include "internal.h"
  31.  
  32. static const uint8_t frame_size[4] = { 24, 20, 4, 1 };
  33.  
  34. static av_cold int g723_1_init(AVFormatContext *s)
  35. {
  36.     AVStream *st;
  37.  
  38.     st = avformat_new_stream(s, NULL);
  39.     if (!st)
  40.         return AVERROR(ENOMEM);
  41.  
  42.     st->codec->codec_type     = AVMEDIA_TYPE_AUDIO;
  43.     st->codec->codec_id       = AV_CODEC_ID_G723_1;
  44.     st->codec->channel_layout = AV_CH_LAYOUT_MONO;
  45.     st->codec->channels       = 1;
  46.     st->codec->sample_rate    = 8000;
  47.  
  48.     avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
  49.     st->start_time = 0;
  50.  
  51.     return 0;
  52. }
  53.  
  54. static int g723_1_read_packet(AVFormatContext *s, AVPacket *pkt)
  55. {
  56.     int size, byte, ret;
  57.  
  58.     pkt->pos = avio_tell(s->pb);
  59.     byte     = avio_r8(s->pb);
  60.     size     = frame_size[byte & 3];
  61.  
  62.     ret = av_new_packet(pkt, size);
  63.     if (ret < 0)
  64.         return ret;
  65.  
  66.     pkt->data[0]      = byte;
  67.     pkt->duration     = 240;
  68.     pkt->stream_index = 0;
  69.  
  70.     ret = avio_read(s->pb, pkt->data + 1, size - 1);
  71.     if (ret < size - 1) {
  72.         av_free_packet(pkt);
  73.         return ret < 0 ? ret : AVERROR_EOF;
  74.     }
  75.  
  76.     return pkt->size;
  77. }
  78.  
  79. AVInputFormat ff_g723_1_demuxer = {
  80.     .name        = "g723_1",
  81.     .long_name   = NULL_IF_CONFIG_SMALL("G.723.1"),
  82.     .read_header = g723_1_init,
  83.     .read_packet = g723_1_read_packet,
  84.     .extensions  = "tco,rco,g723_1",
  85.     .flags       = AVFMT_GENERIC_INDEX
  86. };
  87.