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
00032 #include "stdafx.h"
00033 #include ".\flacmetadatasplitter.h"
00034
00035 FLACMetadataSplitter::FLACMetadataSplitter(void)
00036 : mMetadataBlock(NULL)
00037 {
00038
00039 }
00040
00041 FLACMetadataSplitter::~FLACMetadataSplitter(void)
00042 {
00043 delete mMetadataBlock;
00044
00045
00046 }
00047 StampedOggPacket* FLACMetadataSplitter::convertToStampedPacket(OggPacket* inPacket) {
00048
00049
00050
00051
00052 StampedOggPacket* locStamped = new StampedOggPacket(inPacket->packetData(), inPacket->packetSize(), false, false, 0,0,StampedOggPacket::OGG_END_ONLY);
00053
00054 inPacket->setPacketData(NULL);
00055 delete inPacket;
00056
00057 return locStamped;
00058 }
00059
00060 bool FLACMetadataSplitter::loadMetadata(OggPacket* inMetadata) {
00061
00062 delete mMetadataBlock;
00063 mMetadataBlock = inMetadata;
00064 return splitMetadata();
00065 }
00066 unsigned long FLACMetadataSplitter::numHeaders() {
00067 return mHeaderTweaker.numNewHeaders();
00068 }
00069 StampedOggPacket* FLACMetadataSplitter::getHeader(unsigned long inIndex) {
00070 if (inIndex < mHeaderTweaker.numNewHeaders()) {
00071 return (FLACMetadataSplitter::convertToStampedPacket(mHeaderTweaker.getHeader(inIndex)));
00072 } else {
00073 return NULL;
00074 }
00075 }
00076
00077 void FLACMetadataSplitter::emptyList() {
00078
00079
00080 }
00081 bool FLACMetadataSplitter::splitMetadata() {
00082
00083
00084
00085
00086 if (mMetadataBlock == NULL) {
00087 return false;
00088 } else {
00089 if (verifyCodecID()) {
00090
00091 addCodecIdent();
00092 addStreamInfo();
00093 addOtherHeaders();
00094
00095
00096
00097 return true;
00098 } else {
00099 return false;
00100 }
00101
00102 }
00103
00104 }
00105
00106 bool FLACMetadataSplitter::addOtherHeaders() {
00107
00108 unsigned long locUpto = 42;
00109 unsigned long locMetaSize = mMetadataBlock->packetSize();
00110 unsigned char* locSourceBuff = mMetadataBlock->packetData();
00111 unsigned char* locNewBuff = NULL;
00112 unsigned long locPacketSize = 0;
00113 OggPacket* locPacket = NULL;
00114
00115
00116 while ( locUpto < locMetaSize) {
00117
00118 for (int i = 1; i < 4; i++) {
00119 locPacketSize <<=8;
00120 locPacketSize += locSourceBuff[locUpto+i];
00121 }
00122 locPacketSize += 4;
00123
00124
00125
00126 locNewBuff = new unsigned char[locPacketSize];
00127 memcpy((void*)locNewBuff, (const void*)(locSourceBuff + locUpto), locPacketSize);
00128
00129 locPacket = new OggPacket(locNewBuff, locPacketSize, false, false);
00130
00131
00132 mHeaderTweaker.acceptHeader(locPacket);
00133 locPacket = NULL;
00134
00135 locUpto += (locPacketSize);
00136
00137
00138 }
00139
00140 return true;
00141 }
00142 bool FLACMetadataSplitter::addStreamInfo() {
00143
00144 OggPacket* locPacket = NULL;
00145 unsigned char* locBuff = new unsigned char[38];
00146
00147 memcpy((void*)locBuff, (const void*)(mMetadataBlock->packetData()+4), 38);
00148 locPacket = new OggPacket(locBuff, 38, false, false);
00149
00150
00151 mHeaderTweaker.acceptHeader(locPacket);
00152 return true;
00153 }
00154 bool FLACMetadataSplitter::addCodecIdent() {
00155
00156 OggPacket* locPacket = NULL;
00157 unsigned char* locBuff = new unsigned char[4];
00158 locBuff[0] = 'f';
00159 locBuff[1] = 'L';
00160 locBuff[2] = 'a';
00161 locBuff[3] = 'C';
00162 locPacket = new OggPacket(locBuff, 4, false, false);
00163 mHeaderTweaker.acceptHeader(locPacket);
00164 return true;
00165 }
00166
00167 bool FLACMetadataSplitter::verifyCodecID() {
00168 if ((strncmp((char*)mMetadataBlock->packetData(), "fLaC\000\000\000\042", 8)) == 0) {
00169
00170 return true;
00171 } else {
00172
00173 return false;
00174 }
00175
00176 }