Changeset 411
- Timestamp:
- 04/12/07 02:35:25 (1 year ago)
- Files:
-
- trunk/FFissionCodec/FFissionCodec.r (modified) (1 diff)
- trunk/FFissionCodec/FFissionDecoder.cpp (modified) (6 diffs)
- trunk/FFissionCodec/FFissionDecoder.h (modified) (2 diffs)
- trunk/exportedSymbols (modified) (1 diff)
- trunk/ff_MovieImport.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/FFissionCodec/FFissionCodec.r
r409 r411 53 53 #define kComponentInfo "An AudioCodec that decodes Flash ADPCM into linear PCM" 54 54 #include "XCAResources.r" 55 56 57 #define kComponentEntryPoint "FFissionVBRDecoderEntry" 58 59 #define kPrimaryResourceID 134 60 #define kComponentType 'adec' 61 #define kComponentSubtype kAudioFormatXiphVorbis 62 #define kComponentName "Vorbis" 63 #define kComponentInfo "An AudioCodec that decodes Vorbis audio into linear PCM" 64 #include "XCAResources.r" trunk/FFissionCodec/FFissionDecoder.cpp
r410 r411 26 26 #include "CodecIDs.h" 27 27 28 typedef struct CookieAtomHeader { 29 long size; 30 long type; 31 unsigned char data[1]; 32 } CookieAtomHeader; 33 28 34 struct CodecPair { 29 35 OSType mFormatID; … … 36 42 { kAudioFormatWMA2MS, CODEC_ID_WMAV2 }, 37 43 { kAudioFormatFlashADPCM, CODEC_ID_ADPCM_SWF }, 44 { kAudioFormatXiphVorbis, CODEC_ID_VORBIS }, 38 45 { 0, CODEC_ID_NONE } 39 46 }; … … 132 139 break; 133 140 141 case kAudioFormatXiphVorbis: 142 avContext->extradata_size = ConvertXiphVorbisCookie(); 143 avContext->extradata = magicCookie; 144 break; 145 134 146 default: 135 147 return; … … 138 150 // this is safe because we always allocate this amount of additional memory for our copy of the magic cookie 139 151 memset(avContext->extradata + avContext->extradata_size, 0, FF_INPUT_BUFFER_PADDING_SIZE); 152 } 153 154 int FFissionDecoder::ConvertXiphVorbisCookie() 155 { 156 Byte *ptr = magicCookie; 157 Byte *cend = magicCookie + magicCookieSize; 158 Byte *headerData[3] = {NULL}; 159 int headerSize[3] = {0}; 160 161 while (ptr < cend) { 162 CookieAtomHeader *aheader = reinterpret_cast<CookieAtomHeader *>(ptr); 163 int size = EndianU32_BtoN(aheader->size); 164 ptr += size; 165 if (ptr > cend || size <= 0) 166 break; 167 168 switch(EndianS32_BtoN(aheader->type)) { 169 case kCookieTypeVorbisHeader: 170 headerData[0] = aheader->data; 171 headerSize[0] = size - 8; 172 break; 173 174 case kCookieTypeVorbisComments: 175 headerData[1] = aheader->data; 176 headerSize[1] = size - 8; 177 break; 178 179 case kCookieTypeVorbisCodebooks: 180 headerData[2] = aheader->data; 181 headerSize[2] = size - 8; 182 break; 183 } 184 } 185 186 if (headerSize[0] <= 0 || headerSize[1] <= 0 || headerSize[2] <= 0) { 187 Codecprintf(NULL, "Invalid Vorbis extradata\n"); 188 return 0; 189 } 190 191 int len = headerSize[0] + headerSize[1] + headerSize[2]; 192 Byte *newCookie = new Byte[len + len/255 + 64]; 193 ptr = newCookie; 194 195 ptr[0] = 2; // number of packets minus 1 196 int offset = 1; 197 offset += av_xiphlacing(&ptr[offset], headerSize[0]); 198 offset += av_xiphlacing(&ptr[offset], headerSize[1]); 199 for (int i = 0; i < 3; i++) { 200 memcpy(&ptr[offset], headerData[i], headerSize[i]); 201 offset += headerSize[i]; 202 } 203 204 delete[] magicCookie; 205 magicCookie = newCookie; 206 magicCookieSize = offset; 207 208 return offset; 140 209 } 141 210 … … 349 418 } 350 419 420 421 void FFissionVBRDecoder::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPropertyDataSize, void* outPropertyData) 422 { 423 switch (inPropertyID) { 424 case kAudioCodecPropertyPacketFrameSize: 425 case kAudioCodecPropertyHasVariablePacketByteSizes: 426 if (ioPropertyDataSize != sizeof(UInt32)) 427 CODEC_THROW(kAudioCodecBadPropertySizeError); 428 break; 429 } 430 431 switch (inPropertyID) { 432 case kAudioCodecPropertyPacketFrameSize: 433 *reinterpret_cast<UInt32*>(outPropertyData) = 0; 434 break; 435 436 case kAudioCodecPropertyHasVariablePacketByteSizes: 437 *reinterpret_cast<UInt32*>(outPropertyData) = true; 438 break; 439 440 default: 441 FFissionDecoder::GetProperty(inPropertyID, ioPropertyDataSize, outPropertyData); 442 } 443 } 444 445 351 446 extern "C" 352 447 ComponentResult FFissionDecoderEntry(ComponentParameters* inParameters, FFissionDecoder* inThis) … … 354 449 return ACCodecDispatch(inParameters, inThis); 355 450 } 451 452 extern "C" 453 ComponentResult FFissionVBRDecoderEntry(ComponentParameters* inParameters, FFissionVBRDecoder* inThis) 454 { 455 return ACCodecDispatch(inParameters, inThis); 456 } trunk/FFissionCodec/FFissionDecoder.h
r410 r411 49 49 private: 50 50 void SetupExtradata(OSType formatID); 51 int ConvertXiphVorbisCookie(); 51 52 void OpenAVCodec(); 52 53 … … 61 62 }; 62 63 64 // kAudioCodecPropertyHasVariablePacketByteSizes is queried before our input format is set, 65 // so we can't use that to determine our answer... 66 class FFissionVBRDecoder : public FFissionDecoder 67 { 68 public: 69 FFissionVBRDecoder() : FFissionDecoder() { } 70 virtual void GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPropertyDataSize, void* outPropertyData); 71 }; 72 63 73 #endif trunk/exportedSymbols
r219 r411 5 5 _TextSubCodecComponentDispatch 6 6 _FFissionDecoderEntry 7 _FFissionVBRDecoderEntry trunk/ff_MovieImport.c
r409 r411 86 86 register_avcodec(&wmav2_decoder); 87 87 register_avcodec(&adpcm_swf_decoder); 88 register_avcodec(&vorbis_decoder); 88 89 89 90 av_log_set_callback(FFMpegCodecprintf);
