00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "stdafx.h"
00032 #include "oggstreamfactory.h"
00033
00034
00035
00036 OggStreamFactory::OggStreamFactory(void)
00037 {
00038 }
00039
00040 OggStreamFactory::~OggStreamFactory(void)
00041 {
00042 }
00043
00044
00045 OggStream* OggStreamFactory::CreateStream(OggPage* inOggPage, OggDemuxSourceFilter* inOwningFilter, bool inAllowSeek) {
00046 switch (OggStreamFactory::IdentifyCodec(inOggPage->getPacket(0))) {
00047 case StreamHeaders::VORBIS:
00048 return new VorbisStream(inOggPage, inOwningFilter, inAllowSeek);
00049 case StreamHeaders::SPEEX:
00050 return new SpeexStream(inOggPage, inOwningFilter, inAllowSeek);
00051 case StreamHeaders::FLAC:
00052 return new FLACStream(inOggPage, inOwningFilter, inAllowSeek);
00053 case StreamHeaders::OGG_FLAC_1_0:
00054 return new OggFLAC_1_0_Stream(inOggPage, inOwningFilter, inAllowSeek);
00055 case StreamHeaders::THEORA:
00056 return new TheoraStream(inOggPage, inOwningFilter, inAllowSeek);
00057 case StreamHeaders::FFDSHOW_VIDEO:
00058 return new FFDShowVideoStream(inOggPage, inOwningFilter, inAllowSeek);
00059 case StreamHeaders::NONE:
00060 default:
00061 return NULL;
00062 }
00063 }
00064
00065 StreamHeaders::eCodecType OggStreamFactory::IdentifyCodec(OggPacket* inOggPacket) {
00066 if (strncmp((char*)inOggPacket->packetData(), "\001vorbis", 7) == 0) {
00067 return StreamHeaders::VORBIS;
00068 } else if (strncmp((char*)inOggPacket->packetData(), "Speex ", 8) == 0) {
00069 return StreamHeaders::SPEEX;
00070 } else if ((strncmp((char*)inOggPacket->packetData(), "fLaC", 4)) == 0) {
00071 return StreamHeaders::FLAC;
00072 } else if ((strncmp((char*)inOggPacket->packetData(), "\177FLAC", 5)) == 0) {
00073 return StreamHeaders::OGG_FLAC_1_0;
00074 } else if ((strncmp((char*)inOggPacket->packetData(), "\200theora", 7)) == 0) {
00075 return StreamHeaders::THEORA;
00076 } else if ((strncmp((char*)inOggPacket->packetData(), "\001video\000\000\000", 9)) == 0) {
00077 return StreamHeaders::FFDSHOW_VIDEO;
00078 }
00079
00080 return StreamHeaders::NONE;
00081
00082 }