• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

libavformat/bit.c

Go to the documentation of this file.
00001 /*
00002  * G.729 bit format muxer and demuxer
00003  * Copyright (c) 2007-2008 Vladimir Voroshilov
00004  *
00005  * This file is part of FFmpeg.
00006  *
00007  * FFmpeg is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * FFmpeg is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with FFmpeg; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00020  */
00021 #include "avformat.h"
00022 #include "internal.h"
00023 #include "libavcodec/get_bits.h"
00024 #include "libavcodec/put_bits.h"
00025 
00026 #define MAX_FRAME_SIZE 10
00027 
00028 #define SYNC_WORD  0x6b21
00029 #define BIT_0      0x7f
00030 #define BIT_1      0x81
00031 
00032 static int probe(AVProbeData *p)
00033 {
00034     int i, j;
00035 
00036     if(p->buf_size < 0x40)
00037         return 0;
00038 
00039     for(i=0; i+3<p->buf_size && i< 10*0x50; ){
00040         if(AV_RL16(&p->buf[0]) != SYNC_WORD)
00041             return 0;
00042         j=AV_RL16(&p->buf[2]);
00043         if(j!=0x40 && j!=0x50)
00044             return 0;
00045         i+=j;
00046     }
00047     return AVPROBE_SCORE_MAX/2;
00048 }
00049 
00050 static int read_header(AVFormatContext *s, AVFormatParameters *ap)
00051 {
00052     AVStream* st;
00053 
00054     st=avformat_new_stream(s, NULL);
00055     if (!st)
00056         return AVERROR(ENOMEM);
00057 
00058     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
00059     st->codec->codec_id=CODEC_ID_G729;
00060     st->codec->sample_rate=8000;
00061     st->codec->block_align = 16;
00062     st->codec->channels=1;
00063 
00064     avpriv_set_pts_info(st, 64, 1, 100);
00065     return 0;
00066 }
00067 
00068 static int read_packet(AVFormatContext *s,
00069                           AVPacket *pkt)
00070 {
00071     AVIOContext *pb = s->pb;
00072     PutBitContext pbo;
00073     uint16_t buf[8 * MAX_FRAME_SIZE + 2];
00074     int packet_size;
00075     uint16_t* src=buf;
00076     int i, j, ret;
00077     int64_t pos= avio_tell(pb);
00078 
00079     if(url_feof(pb))
00080         return AVERROR_EOF;
00081 
00082     avio_rl16(pb); // sync word
00083     packet_size = avio_rl16(pb) / 8;
00084     if(packet_size > MAX_FRAME_SIZE)
00085         return AVERROR_INVALIDDATA;
00086 
00087     ret = avio_read(pb, (uint8_t*)buf, (8 * packet_size) * sizeof(uint16_t));
00088     if(ret<0)
00089         return ret;
00090     if(ret != 8 * packet_size * sizeof(uint16_t))
00091         return AVERROR(EIO);
00092 
00093     av_new_packet(pkt, packet_size);
00094 
00095     init_put_bits(&pbo, pkt->data, packet_size);
00096     for(j=0; j < packet_size; j++)
00097         for(i=0; i<8;i++)
00098             put_bits(&pbo,1, AV_RL16(src++) == BIT_1 ? 1 : 0);
00099 
00100     flush_put_bits(&pbo);
00101 
00102     pkt->duration=1;
00103     pkt->pos = pos;
00104     return 0;
00105 }
00106 
00107 AVInputFormat ff_bit_demuxer = {
00108     .name        = "bit",
00109     .long_name   = NULL_IF_CONFIG_SMALL("G.729 BIT file format"),
00110     .read_probe  = probe,
00111     .read_header = read_header,
00112     .read_packet = read_packet,
00113     .extensions  = "bit",
00114 };
00115 
00116 #if CONFIG_MUXERS
00117 static int write_header(AVFormatContext *s)
00118 {
00119     AVCodecContext *enc = s->streams[0]->codec;
00120 
00121     enc->codec_id = CODEC_ID_G729;
00122     enc->channels = 1;
00123     enc->bits_per_coded_sample = 16;
00124     enc->block_align = (enc->bits_per_coded_sample * enc->channels) >> 3;
00125 
00126     return 0;
00127 }
00128 
00129 static int write_packet(AVFormatContext *s, AVPacket *pkt)
00130 {
00131     AVIOContext *pb = s->pb;
00132     GetBitContext gb;
00133     int i;
00134 
00135     avio_wl16(pb, SYNC_WORD);
00136     avio_wl16(pb, 8 * 10);
00137 
00138     init_get_bits(&gb, pkt->data, 8*10);
00139     for(i=0; i< 8 * 10; i++)
00140         avio_wl16(pb, get_bits1(&gb) ? BIT_1 : BIT_0);
00141     avio_flush(pb);
00142 
00143     return 0;
00144 }
00145 
00146 AVOutputFormat ff_bit_muxer = {
00147     .name         = "bit",
00148     .long_name    = NULL_IF_CONFIG_SMALL("G.729 BIT file format"),
00149     .mime_type    = "audio/bit",
00150     .extensions   = "bit",
00151     .audio_codec  = CODEC_ID_G729,
00152     .video_codec  = CODEC_ID_NONE,
00153     .write_header = write_header,
00154     .write_packet = write_packet,
00155 };
00156 #endif
Generated on Fri Feb 1 2013 14:34:51 for FFmpeg by doxygen 1.7.1