libavformat/g723_1.c
f990dc37
 /*
  * G.723.1 demuxer
  * Copyright (c) 2010 Mohamed Naufal Basheer
  *
  * 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.723.1 demuxer
  */
 
a903f8f0
 #include "libavutil/channel_layout.h"
f990dc37
 #include "avformat.h"
215b7724
 #include "internal.h"
f990dc37
 
55c3a4f6
 static const uint8_t frame_size[4] = { 24, 20, 4, 1 };
f990dc37
 
e37f161e
 static int g723_1_init(AVFormatContext *s)
f990dc37
 {
     AVStream *st;
 
0e5ecd80
     st = avformat_new_stream(s, NULL);
f990dc37
     if (!st)
         return AVERROR(ENOMEM);
 
55c3a4f6
     st->codec->codec_type     = AVMEDIA_TYPE_AUDIO;
36ef5369
     st->codec->codec_id       = AV_CODEC_ID_G723_1;
55c3a4f6
     st->codec->channel_layout = AV_CH_LAYOUT_MONO;
     st->codec->channels       = 1;
     st->codec->sample_rate    = 8000;
f990dc37
 
215b7724
     avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
55c3a4f6
     st->start_time = 0;
f990dc37
 
     return 0;
 }
 
 static int g723_1_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     int size, byte, ret;
 
63b796b0
     pkt->pos = avio_tell(s->pb);
055cda8a
     byte     = avio_r8(s->pb);
f990dc37
     size     = frame_size[byte & 3];
 
     ret = av_new_packet(pkt, size);
     if (ret < 0)
         return ret;
 
     pkt->data[0]      = byte;
     pkt->duration     = 240;
     pkt->stream_index = 0;
 
53d70a33
     ret = avio_read(s->pb, pkt->data + 1, size - 1);
f990dc37
     if (ret < size - 1) {
         av_free_packet(pkt);
         return ret < 0 ? ret : AVERROR_EOF;
     }
 
     return pkt->size;
 }
 
 AVInputFormat ff_g723_1_demuxer = {
ba10207b
     .name        = "g723_1",
6774247a
     .long_name   = NULL_IF_CONFIG_SMALL("G.723.1"),
ba10207b
     .read_header = g723_1_init,
     .read_packet = g723_1_read_packet,
9023de34
     .extensions  = "tco,rco,g723_1",
55c3a4f6
     .flags       = AVFMT_GENERIC_INDEX
f990dc37
 };