diff --git a/libavformat/Makefile b/libavformat/Makefile
index a7598d9a9b35b81b9d09e5b753d41100a6250f50..66718425f402e3af98c6803183929f79b20e374f 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -21,8 +21,8 @@ OBJS-$(CONFIG_AAC_DEMUXER)               += aacdec.o id3v1.o id3v2.o raw.o
 OBJS-$(CONFIG_AC3_DEMUXER)               += ac3dec.o raw.o
 OBJS-$(CONFIG_AC3_MUXER)                 += raw.o
 OBJS-$(CONFIG_ADTS_MUXER)                += adtsenc.o
-OBJS-$(CONFIG_AEA_DEMUXER)               += aea.o raw.o
-OBJS-$(CONFIG_AIFF_DEMUXER)              += aiffdec.o riff.o raw.o
+OBJS-$(CONFIG_AEA_DEMUXER)               += aea.o pcm.o
+OBJS-$(CONFIG_AIFF_DEMUXER)              += aiffdec.o riff.o pcm.o
 OBJS-$(CONFIG_AIFF_MUXER)                += aiffenc.o riff.o
 OBJS-$(CONFIG_AMR_DEMUXER)               += amr.o
 OBJS-$(CONFIG_AMR_MUXER)                 += amr.o
@@ -35,7 +35,7 @@ OBJS-$(CONFIG_ASF_DEMUXER)               += asfdec.o asf.o asfcrypt.o \
 OBJS-$(CONFIG_ASF_MUXER)                 += asfenc.o asf.o riff.o
 OBJS-$(CONFIG_ASS_DEMUXER)               += assdec.o
 OBJS-$(CONFIG_ASS_MUXER)                 += assenc.o
-OBJS-$(CONFIG_AU_DEMUXER)                += au.o raw.o
+OBJS-$(CONFIG_AU_DEMUXER)                += au.o pcm.o
 OBJS-$(CONFIG_AU_MUXER)                  += au.o
 OBJS-$(CONFIG_AVI_DEMUXER)               += avidec.o riff.o avi.o
 OBJS-$(CONFIG_AVI_MUXER)                 += avienc.o riff.o avi.o
@@ -116,7 +116,7 @@ OBJS-$(CONFIG_MJPEG_MUXER)               += raw.o
 OBJS-$(CONFIG_MLP_DEMUXER)               += raw.o
 OBJS-$(CONFIG_MLP_MUXER)                 += raw.o
 OBJS-$(CONFIG_MM_DEMUXER)                += mm.o
-OBJS-$(CONFIG_MMF_DEMUXER)               += mmf.o raw.o
+OBJS-$(CONFIG_MMF_DEMUXER)               += mmf.o pcm.o
 OBJS-$(CONFIG_MMF_MUXER)                 += mmf.o riff.o
 OBJS-$(CONFIG_MOV_DEMUXER)               += mov.o riff.o isom.o
 OBJS-$(CONFIG_MOV_MUXER)                 += movenc.o riff.o isom.o avc.o movenchint.o
@@ -160,46 +160,46 @@ OBJS-$(CONFIG_OGG_DEMUXER)               += oggdec.o         \
                                             vorbiscomment.o
 OBJS-$(CONFIG_OGG_MUXER)                 += oggenc.o \
                                             vorbiscomment.o
-OBJS-$(CONFIG_OMA_DEMUXER)               += oma.o raw.o id3v2.o id3v1.o
-OBJS-$(CONFIG_PCM_ALAW_DEMUXER)          += raw.o
+OBJS-$(CONFIG_OMA_DEMUXER)               += oma.o pcm.o id3v2.o id3v1.o
+OBJS-$(CONFIG_PCM_ALAW_DEMUXER)          += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_ALAW_MUXER)            += raw.o
-OBJS-$(CONFIG_PCM_F32BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_F32BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_F32BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_F32LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_F32LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_F32LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_F64BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_F64BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_F64BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_F64LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_F64LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_F64LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_MULAW_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_MULAW_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_MULAW_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S16BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_S16BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S16BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S16LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_S16LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S16LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S24BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_S24BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S24BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S24LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_S24LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S24LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S32BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_S32BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S32BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S32LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_S32LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S32LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_S8_DEMUXER)            += raw.o
+OBJS-$(CONFIG_PCM_S8_DEMUXER)            += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_S8_MUXER)              += raw.o
-OBJS-$(CONFIG_PCM_U16BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_U16BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U16BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_U16LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_U16LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U16LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_U24BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_U24BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U24BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_U24LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_U24LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U24LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_U32BE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_U32BE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U32BE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_U32LE_DEMUXER)         += raw.o
+OBJS-$(CONFIG_PCM_U32LE_DEMUXER)         += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U32LE_MUXER)           += raw.o
-OBJS-$(CONFIG_PCM_U8_DEMUXER)            += raw.o
+OBJS-$(CONFIG_PCM_U8_DEMUXER)            += pcmdec.o pcm.o raw.o
 OBJS-$(CONFIG_PCM_U8_MUXER)              += raw.o
 OBJS-$(CONFIG_PVA_DEMUXER)               += pva.o
 OBJS-$(CONFIG_QCP_DEMUXER)               += qcp.o
@@ -211,7 +211,7 @@ OBJS-$(CONFIG_RM_DEMUXER)                += rmdec.o rm.o
 OBJS-$(CONFIG_RM_MUXER)                  += rmenc.o rm.o
 OBJS-$(CONFIG_ROQ_DEMUXER)               += idroqdec.o
 OBJS-$(CONFIG_ROQ_MUXER)                 += idroqenc.o raw.o
-OBJS-$(CONFIG_RSO_DEMUXER)               += rsodec.o rso.o raw.o
+OBJS-$(CONFIG_RSO_DEMUXER)               += rsodec.o rso.o pcm.o
 OBJS-$(CONFIG_RSO_MUXER)                 += rsoenc.o rso.o
 OBJS-$(CONFIG_RPL_DEMUXER)               += rpl.o
 OBJS-$(CONFIG_RTP_MUXER)                 += rtp.o         \
@@ -244,8 +244,8 @@ OBJS-$(CONFIG_SEGAFILM_DEMUXER)          += segafilm.o
 OBJS-$(CONFIG_SHORTEN_DEMUXER)           += raw.o
 OBJS-$(CONFIG_SIFF_DEMUXER)              += siff.o
 OBJS-$(CONFIG_SMACKER_DEMUXER)           += smacker.o
-OBJS-$(CONFIG_SOL_DEMUXER)               += sol.o raw.o
-OBJS-$(CONFIG_SOX_DEMUXER)               += soxdec.o raw.o
+OBJS-$(CONFIG_SOL_DEMUXER)               += sol.o pcm.o
+OBJS-$(CONFIG_SOX_DEMUXER)               += soxdec.o pcm.o
 OBJS-$(CONFIG_SOX_MUXER)                 += soxenc.o
 OBJS-$(CONFIG_SPDIF_MUXER)               += spdif.o
 OBJS-$(CONFIG_SRT_DEMUXER)               += srtdec.o
@@ -268,8 +268,8 @@ OBJS-$(CONFIG_VMD_DEMUXER)               += sierravmd.o
 OBJS-$(CONFIG_VOC_DEMUXER)               += vocdec.o voc.o
 OBJS-$(CONFIG_VOC_MUXER)                 += vocenc.o voc.o
 OBJS-$(CONFIG_VQF_DEMUXER)               += vqf.o
-OBJS-$(CONFIG_W64_DEMUXER)               += wav.o riff.o raw.o
-OBJS-$(CONFIG_WAV_DEMUXER)               += wav.o riff.o raw.o
+OBJS-$(CONFIG_W64_DEMUXER)               += wav.o riff.o pcm.o
+OBJS-$(CONFIG_WAV_DEMUXER)               += wav.o riff.o pcm.o
 OBJS-$(CONFIG_WAV_MUXER)                 += wav.o riff.o
 OBJS-$(CONFIG_WC3_DEMUXER)               += wc3movie.o
 OBJS-$(CONFIG_WEBM_MUXER)                += matroskaenc.o matroska.o \
diff --git a/libavformat/aea.c b/libavformat/aea.c
index 518995c4b0335192a6499f0210322a377b3329a7..2c4f471b206c1254a0c494f9992d4cb88d9108a6 100644
--- a/libavformat/aea.c
+++ b/libavformat/aea.c
@@ -21,7 +21,7 @@
  */
 
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 #include "libavutil/intreadwrite.h"
 
 #define AT1_SU_SIZE     212
diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c
index f72af00f4cf46d34271dca31d922726b37dae56e..255caa3a5bebcea8b86194c3680cf4268c5892b8 100644
--- a/libavformat/aiffdec.c
+++ b/libavformat/aiffdec.c
@@ -21,7 +21,7 @@
 
 #include "libavutil/intfloat_readwrite.h"
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 #include "aiff.h"
 
 #define AIFF                    0
diff --git a/libavformat/au.c b/libavformat/au.c
index a9c7d03c57e0670a166c7af939db391def6564f7..cb1c31dc18256a7ea451077a7521f80ded1f6446 100644
--- a/libavformat/au.c
+++ b/libavformat/au.c
@@ -28,7 +28,7 @@
  */
 
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 #include "riff.h"
 
 /* if we don't know the size in advance */
diff --git a/libavformat/mmf.c b/libavformat/mmf.c
index 540407f65911f7813044cb5c7ccaa20db2e725a7..85b23a3a6aad59cde994a8079d494d635815db00 100644
--- a/libavformat/mmf.c
+++ b/libavformat/mmf.c
@@ -19,7 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 #include "riff.h"
 
 typedef struct {
diff --git a/libavformat/oma.c b/libavformat/oma.c
index a47fde02f98672e82885964d68a35ac345fcf32f..cdf11067e7f5fc2cf235c6831e9f02c54586ad33 100644
--- a/libavformat/oma.c
+++ b/libavformat/oma.c
@@ -45,7 +45,7 @@
 
 #include "avformat.h"
 #include "libavutil/intreadwrite.h"
-#include "raw.h"
+#include "pcm.h"
 #include "riff.h"
 #include "id3v2.h"
 
diff --git a/libavformat/pcm.c b/libavformat/pcm.c
new file mode 100644
index 0000000000000000000000000000000000000000..5de23af1cbb92c1dd3e334887219d0caa7f283e2
--- /dev/null
+++ b/libavformat/pcm.c
@@ -0,0 +1,55 @@
+/*
+ * PCM common functions
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * 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
+ */
+
+#include "avformat.h"
+#include "pcm.h"
+
+int pcm_read_seek(AVFormatContext *s,
+                  int stream_index, int64_t timestamp, int flags)
+{
+    AVStream *st;
+    int block_align, byte_rate;
+    int64_t pos, ret;
+
+    st = s->streams[0];
+
+    block_align = st->codec->block_align ? st->codec->block_align :
+        (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
+    byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
+        block_align * st->codec->sample_rate;
+
+    if (block_align <= 0 || byte_rate <= 0)
+        return -1;
+    if (timestamp < 0) timestamp = 0;
+
+    /* compute the position by aligning it to block_align */
+    pos = av_rescale_rnd(timestamp * byte_rate,
+                         st->time_base.num,
+                         st->time_base.den * (int64_t)block_align,
+                         (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
+    pos *= block_align;
+
+    /* recompute exact position */
+    st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
+    if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0)
+        return ret;
+    return 0;
+}
diff --git a/libavformat/pcm.h b/libavformat/pcm.h
new file mode 100644
index 0000000000000000000000000000000000000000..7c0b7d70aa1597735f80ce03152b738f856ee624
--- /dev/null
+++ b/libavformat/pcm.h
@@ -0,0 +1,30 @@
+/*
+ * PCM common functions
+ * Copyright (C) 2007  Aurelien Jacobs <aurel@gnuage.org>
+ *
+ * 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
+ */
+
+#ifndef AVFORMAT_PCM_H
+#define AVFORMAT_PCM_H
+
+#include "avformat.h"
+
+int pcm_read_seek(AVFormatContext *s,
+                  int stream_index, int64_t timestamp, int flags);
+
+#endif /* AVFORMAT_PCM_H */
diff --git a/libavformat/pcmdec.c b/libavformat/pcmdec.c
new file mode 100644
index 0000000000000000000000000000000000000000..b657fb680b625329698fba4abc1a9e8254bf9350
--- /dev/null
+++ b/libavformat/pcmdec.c
@@ -0,0 +1,122 @@
+/*
+ * RAW PCM demuxers
+ * Copyright (c) 2002 Fabrice Bellard
+ *
+ * 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
+ */
+
+#include "avformat.h"
+#include "raw.h"
+#include "pcm.h"
+
+#define RAW_SAMPLES     1024
+
+static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret, size, bps;
+    //    AVStream *st = s->streams[0];
+
+    size= RAW_SAMPLES*s->streams[0]->codec->block_align;
+
+    ret= av_get_packet(s->pb, pkt, size);
+
+    pkt->stream_index = 0;
+    if (ret < 0)
+        return ret;
+
+    bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
+    assert(bps); // if false there IS a bug elsewhere (NOT in this function)
+    pkt->dts=
+    pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);
+
+    return ret;
+}
+
+#define PCMDEF(name, long_name, ext, codec) \
+AVInputFormat pcm_ ## name ## _demuxer = {\
+    #name,\
+    NULL_IF_CONFIG_SMALL(long_name),\
+    0,\
+    NULL,\
+    ff_raw_read_header,\
+    raw_read_packet,\
+    NULL,\
+    pcm_read_seek,\
+    .flags= AVFMT_GENERIC_INDEX,\
+    .extensions = ext,\
+    .value = codec,\
+};
+
+PCMDEF(f64be, "PCM 64 bit floating-point big-endian format",
+       NULL, CODEC_ID_PCM_F64BE)
+
+PCMDEF(f64le, "PCM 64 bit floating-point little-endian format",
+       NULL, CODEC_ID_PCM_F64LE)
+
+PCMDEF(f32be, "PCM 32 bit floating-point big-endian format",
+       NULL, CODEC_ID_PCM_F32BE)
+
+PCMDEF(f32le, "PCM 32 bit floating-point little-endian format",
+       NULL, CODEC_ID_PCM_F32LE)
+
+PCMDEF(s32be, "PCM signed 32 bit big-endian format",
+       NULL, CODEC_ID_PCM_S32BE)
+
+PCMDEF(s32le, "PCM signed 32 bit little-endian format",
+       NULL, CODEC_ID_PCM_S32LE)
+
+PCMDEF(s24be, "PCM signed 24 bit big-endian format",
+       NULL, CODEC_ID_PCM_S24BE)
+
+PCMDEF(s24le, "PCM signed 24 bit little-endian format",
+       NULL, CODEC_ID_PCM_S24LE)
+
+PCMDEF(s16be, "PCM signed 16 bit big-endian format",
+       AV_NE("sw", NULL), CODEC_ID_PCM_S16BE)
+
+PCMDEF(s16le, "PCM signed 16 bit little-endian format",
+       AV_NE(NULL, "sw"), CODEC_ID_PCM_S16LE)
+
+PCMDEF(s8, "PCM signed 8 bit format",
+       "sb", CODEC_ID_PCM_S8)
+
+PCMDEF(u32be, "PCM unsigned 32 bit big-endian format",
+       NULL, CODEC_ID_PCM_U32BE)
+
+PCMDEF(u32le, "PCM unsigned 32 bit little-endian format",
+       NULL, CODEC_ID_PCM_U32LE)
+
+PCMDEF(u24be, "PCM unsigned 24 bit big-endian format",
+       NULL, CODEC_ID_PCM_U24BE)
+
+PCMDEF(u24le, "PCM unsigned 24 bit little-endian format",
+       NULL, CODEC_ID_PCM_U24LE)
+
+PCMDEF(u16be, "PCM unsigned 16 bit big-endian format",
+       AV_NE("uw", NULL), CODEC_ID_PCM_U16BE)
+
+PCMDEF(u16le, "PCM unsigned 16 bit little-endian format",
+       AV_NE(NULL, "uw"), CODEC_ID_PCM_U16LE)
+
+PCMDEF(u8, "PCM unsigned 8 bit format",
+       "ub", CODEC_ID_PCM_U8)
+
+PCMDEF(alaw, "PCM A-law format",
+       "al", CODEC_ID_PCM_ALAW)
+
+PCMDEF(mulaw, "PCM mu-law format",
+       "ul", CODEC_ID_PCM_MULAW)
diff --git a/libavformat/raw.c b/libavformat/raw.c
index af8e392921e9d4835a9d7d4ca389f4eb6d2e5b3b..f863d24e1a7341dfaded5d6dac2a31f79502c568 100644
--- a/libavformat/raw.c
+++ b/libavformat/raw.c
@@ -36,7 +36,7 @@ int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt)
 
 #if CONFIG_DEMUXERS
 /* raw input */
-static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
+int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     AVStream *st;
     enum CodecID id;
@@ -81,28 +81,6 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
 }
 
 #define RAW_PACKET_SIZE 1024
-#define RAW_SAMPLES     1024
-
-static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    int ret, size, bps;
-    //    AVStream *st = s->streams[0];
-
-    size= RAW_SAMPLES*s->streams[0]->codec->block_align;
-
-    ret= av_get_packet(s->pb, pkt, size);
-
-    pkt->stream_index = 0;
-    if (ret < 0)
-        return ret;
-
-    bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
-    assert(bps); // if false there IS a bug elsewhere (NOT in this function)
-    pkt->dts=
-    pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);
-
-    return ret;
-}
 
 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
 {
@@ -150,38 +128,6 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
 #endif
 
 #if CONFIG_DEMUXERS
-int pcm_read_seek(AVFormatContext *s,
-                  int stream_index, int64_t timestamp, int flags)
-{
-    AVStream *st;
-    int block_align, byte_rate;
-    int64_t pos, ret;
-
-    st = s->streams[0];
-
-    block_align = st->codec->block_align ? st->codec->block_align :
-        (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
-    byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
-        block_align * st->codec->sample_rate;
-
-    if (block_align <= 0 || byte_rate <= 0)
-        return -1;
-    if (timestamp < 0) timestamp = 0;
-
-    /* compute the position by aligning it to block_align */
-    pos = av_rescale_rnd(timestamp * byte_rate,
-                         st->time_base.num,
-                         st->time_base.den * (int64_t)block_align,
-                         (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
-    pos *= block_align;
-
-    /* recompute exact position */
-    st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
-    if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0)
-        return ret;
-    return 0;
-}
-
 int ff_raw_audio_read_header(AVFormatContext *s,
                              AVFormatParameters *ap)
 {
@@ -529,7 +475,7 @@ AVInputFormat rawvideo_demuxer = {
     NULL_IF_CONFIG_SMALL("raw video format"),
     0,
     NULL,
-    raw_read_header,
+    ff_raw_read_header,
     rawvideo_read_packet,
     .flags= AVFMT_GENERIC_INDEX,
     .extensions = "yuv,cif,qcif,rgb",
@@ -581,21 +527,6 @@ AVInputFormat vc1_demuxer = {
 
 /* PCM formats */
 
-#define PCMINPUTDEF(name, long_name, ext, codec) \
-AVInputFormat pcm_ ## name ## _demuxer = {\
-    #name,\
-    NULL_IF_CONFIG_SMALL(long_name),\
-    0,\
-    NULL,\
-    raw_read_header,\
-    raw_read_packet,\
-    NULL,\
-    pcm_read_seek,\
-    .flags= AVFMT_GENERIC_INDEX,\
-    .extensions = ext,\
-    .value = codec,\
-};
-
 #define PCMOUTPUTDEF(name, long_name, ext, codec) \
 AVOutputFormat pcm_ ## name ## _muxer = {\
     #name,\
@@ -611,15 +542,8 @@ AVOutputFormat pcm_ ## name ## _muxer = {\
 };
 
 
-#if  !CONFIG_MUXERS && CONFIG_DEMUXERS
-#define PCMDEF(name, long_name, ext, codec) \
-        PCMINPUTDEF(name, long_name, ext, codec)
-#elif CONFIG_MUXERS && !CONFIG_DEMUXERS
-#define PCMDEF(name, long_name, ext, codec) \
-        PCMOUTPUTDEF(name, long_name, ext, codec)
-#elif CONFIG_MUXERS && CONFIG_DEMUXERS
+#if CONFIG_MUXERS
 #define PCMDEF(name, long_name, ext, codec) \
-        PCMINPUTDEF(name, long_name, ext, codec)\
         PCMOUTPUTDEF(name, long_name, ext, codec)
 #else
 #define PCMDEF(name, long_name, ext, codec)
diff --git a/libavformat/raw.h b/libavformat/raw.h
index 73d1d5d06947e415d56e1df59ce15fcfd6899c76..9621e0c45db081d3fc453827eeb0726e1dd40349 100644
--- a/libavformat/raw.h
+++ b/libavformat/raw.h
@@ -24,11 +24,10 @@
 
 #include "avformat.h"
 
-int pcm_read_seek(AVFormatContext *s,
-                  int stream_index, int64_t timestamp, int flags);
-
 int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt);
 
+int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap);
+
 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt);
 
 int ff_raw_audio_read_header(AVFormatContext *s, AVFormatParameters *ap);
diff --git a/libavformat/rsodec.c b/libavformat/rsodec.c
index fbcf918c7e7c61e675dd89dfa947cbc1e289e939..e86b8e7d5f06dad57cebd3ebf7d80a37ed760b49 100644
--- a/libavformat/rsodec.c
+++ b/libavformat/rsodec.c
@@ -23,7 +23,7 @@
 #include "libavutil/intreadwrite.h"
 #include "avformat.h"
 #include "internal.h"
-#include "raw.h"
+#include "pcm.h"
 #include "riff.h"
 #include "rso.h"
 
diff --git a/libavformat/sol.c b/libavformat/sol.c
index a7faacc8e860e30c14266c66498cdb45d1878192..5573ddd68aa71f1497be105d845b56c30a4b87c7 100644
--- a/libavformat/sol.c
+++ b/libavformat/sol.c
@@ -25,7 +25,7 @@
 
 #include "libavutil/bswap.h"
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 
 /* if we don't know the size in advance */
 #define AU_UNKNOWN_SIZE ((uint32_t)(~0))
diff --git a/libavformat/soxdec.c b/libavformat/soxdec.c
index 42fa53e430cb784b9a8390b92754570db9144945..10c5bbe38769b15907c5ff1c4a82503257560dda 100644
--- a/libavformat/soxdec.c
+++ b/libavformat/soxdec.c
@@ -31,7 +31,7 @@
 
 #include "libavutil/intreadwrite.h"
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 #include "sox.h"
 
 static int sox_probe(AVProbeData *p)
diff --git a/libavformat/wav.c b/libavformat/wav.c
index 4c72bec8e91198a584760f8c1a054a1f7219fad1..ca687a3adb00d1756152a36eb2b570a97a6b3bef 100644
--- a/libavformat/wav.c
+++ b/libavformat/wav.c
@@ -23,7 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "avformat.h"
-#include "raw.h"
+#include "pcm.h"
 #include "riff.h"
 
 typedef struct {