Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * RAW PCM demuxers
  3.  * Copyright (c) 2002 Fabrice Bellard
  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. #include "avformat.h"
  23. #include "internal.h"
  24. #include "pcm.h"
  25. #include "libavutil/log.h"
  26. #include "libavutil/opt.h"
  27. #include "libavutil/avassert.h"
  28.  
  29. typedef struct PCMAudioDemuxerContext {
  30.     AVClass *class;
  31.     int sample_rate;
  32.     int channels;
  33. } PCMAudioDemuxerContext;
  34.  
  35. static int pcm_read_header(AVFormatContext *s)
  36. {
  37.     PCMAudioDemuxerContext *s1 = s->priv_data;
  38.     AVStream *st;
  39.  
  40.     st = avformat_new_stream(s, NULL);
  41.     if (!st)
  42.         return AVERROR(ENOMEM);
  43.  
  44.  
  45.     st->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
  46.     st->codec->codec_id    = s->iformat->raw_codec_id;
  47.     st->codec->sample_rate = s1->sample_rate;
  48.     st->codec->channels    = s1->channels;
  49.  
  50.     st->codec->bits_per_coded_sample =
  51.         av_get_bits_per_sample(st->codec->codec_id);
  52.  
  53.     av_assert0(st->codec->bits_per_coded_sample > 0);
  54.  
  55.     st->codec->block_align =
  56.         st->codec->bits_per_coded_sample * st->codec->channels / 8;
  57.  
  58.     avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
  59.     return 0;
  60. }
  61.  
  62. static const AVOption pcm_options[] = {
  63.     { "sample_rate", "", offsetof(PCMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 44100}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
  64.     { "channels",    "", offsetof(PCMAudioDemuxerContext, channels),    AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
  65.     { NULL },
  66. };
  67.  
  68. #define PCMDEF(name_, long_name_, ext, codec)               \
  69. static const AVClass name_ ## _demuxer_class = {            \
  70.     .class_name = #name_ " demuxer",                        \
  71.     .item_name  = av_default_item_name,                     \
  72.     .option     = pcm_options,                              \
  73.     .version    = LIBAVUTIL_VERSION_INT,                    \
  74. };                                                          \
  75. AVInputFormat ff_pcm_ ## name_ ## _demuxer = {              \
  76.     .name           = #name_,                               \
  77.     .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
  78.     .priv_data_size = sizeof(PCMAudioDemuxerContext),       \
  79.     .read_header    = pcm_read_header,                      \
  80.     .read_packet    = ff_pcm_read_packet,                   \
  81.     .read_seek      = ff_pcm_read_seek,                     \
  82.     .flags          = AVFMT_GENERIC_INDEX,                  \
  83.     .extensions     = ext,                                  \
  84.     .raw_codec_id   = codec,                                \
  85.     .priv_class     = &name_ ## _demuxer_class,             \
  86. };
  87.  
  88. PCMDEF(f64be, "PCM 64-bit floating-point big-endian",
  89.        NULL, AV_CODEC_ID_PCM_F64BE)
  90.  
  91. PCMDEF(f64le, "PCM 64-bit floating-point little-endian",
  92.        NULL, AV_CODEC_ID_PCM_F64LE)
  93.  
  94. PCMDEF(f32be, "PCM 32-bit floating-point big-endian",
  95.        NULL, AV_CODEC_ID_PCM_F32BE)
  96.  
  97. PCMDEF(f32le, "PCM 32-bit floating-point little-endian",
  98.        NULL, AV_CODEC_ID_PCM_F32LE)
  99.  
  100. PCMDEF(s32be, "PCM signed 32-bit big-endian",
  101.        NULL, AV_CODEC_ID_PCM_S32BE)
  102.  
  103. PCMDEF(s32le, "PCM signed 32-bit little-endian",
  104.        NULL, AV_CODEC_ID_PCM_S32LE)
  105.  
  106. PCMDEF(s24be, "PCM signed 24-bit big-endian",
  107.        NULL, AV_CODEC_ID_PCM_S24BE)
  108.  
  109. PCMDEF(s24le, "PCM signed 24-bit little-endian",
  110.        NULL, AV_CODEC_ID_PCM_S24LE)
  111.  
  112. PCMDEF(s16be, "PCM signed 16-bit big-endian",
  113.        AV_NE("sw", NULL), AV_CODEC_ID_PCM_S16BE)
  114.  
  115. PCMDEF(s16le, "PCM signed 16-bit little-endian",
  116.        AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE)
  117.  
  118. PCMDEF(s8, "PCM signed 8-bit",
  119.        "sb", AV_CODEC_ID_PCM_S8)
  120.  
  121. PCMDEF(u32be, "PCM unsigned 32-bit big-endian",
  122.        NULL, AV_CODEC_ID_PCM_U32BE)
  123.  
  124. PCMDEF(u32le, "PCM unsigned 32-bit little-endian",
  125.        NULL, AV_CODEC_ID_PCM_U32LE)
  126.  
  127. PCMDEF(u24be, "PCM unsigned 24-bit big-endian",
  128.        NULL, AV_CODEC_ID_PCM_U24BE)
  129.  
  130. PCMDEF(u24le, "PCM unsigned 24-bit little-endian",
  131.        NULL, AV_CODEC_ID_PCM_U24LE)
  132.  
  133. PCMDEF(u16be, "PCM unsigned 16-bit big-endian",
  134.        AV_NE("uw", NULL), AV_CODEC_ID_PCM_U16BE)
  135.  
  136. PCMDEF(u16le, "PCM unsigned 16-bit little-endian",
  137.        AV_NE(NULL, "uw"), AV_CODEC_ID_PCM_U16LE)
  138.  
  139. PCMDEF(u8, "PCM unsigned 8-bit",
  140.        "ub", AV_CODEC_ID_PCM_U8)
  141.  
  142. PCMDEF(alaw, "PCM A-law",
  143.        "al", AV_CODEC_ID_PCM_ALAW)
  144.  
  145. PCMDEF(mulaw, "PCM mu-law",
  146.        "ul", AV_CODEC_ID_PCM_MULAW)
  147.