in swfutils/src/main/java/flash/swf/TagDecoder.java [215:414]
private Tag decodeTag(int type, int length) throws IOException
{
Tag t;
int pos = r.getOffset();
switch (type)
{
case stagProductInfo:
t = decodeSerialNumber();
break;
case stagShowFrame:
t = new ShowFrame();
break;
case stagMetadata:
t = decodeMetadata();
break;
case stagDefineShape:
case stagDefineShape2:
case stagDefineShape3:
case stagDefineShape4:
t = decodeDefineShape(type);
break;
case stagPlaceObject:
t = decodePlaceObject(length);
break;
case stagRemoveObject:
case stagRemoveObject2:
t = decodeRemoveObject(type);
break;
case stagDefineBinaryData:
t = decodeDefineBinaryData(length);
break;
case stagDefineBits:
t = decodeDefineBits(length);
break;
case stagDefineButton:
t = decodeDefineButton(length);
break;
case stagJPEGTables:
t = jpegTables = decodeJPEGTables(length);
break;
case stagSetBackgroundColor:
t = decodeSetBackgroundColor();
break;
case stagDefineFont:
t = decodeDefineFont();
break;
case stagDefineText:
case stagDefineText2:
t = decodeDefineText(type);
break;
case stagDoAction:
t = decodeDoAction(length);
break;
case stagDefineFontInfo:
case stagDefineFontInfo2:
t = decodeDefineFontInfo(type, length);
break;
case stagDefineSound:
t = decodeDefineSound(length);
break;
case stagStartSound:
t = decodeStartSound();
break;
case stagDefineButtonSound:
t = decodeDefineButtonSound();
break;
case stagSoundStreamHead2:
case stagSoundStreamHead:
t = decodeSoundStreamHead(type);
break;
case stagSoundStreamBlock:
t = decodeSoundStreamBlock(length);
break;
case stagDefineBitsLossless:
t = decodeDefineBitsLossless(length);
break;
case stagDefineBitsJPEG2:
t = decodeDefineJPEG2(length);
break;
case stagDefineButtonCxform:
t = decodeDefineButtonCxform();
break;
case stagProtect:
t = decodeProtect(length);
break;
case stagPlaceObject2:
t = decodePlaceObject23(stagPlaceObject2, length);
break;
case stagPlaceObject3:
t = decodePlaceObject23(stagPlaceObject3, length);
break;
case stagDefineButton2:
t = decodeDefineButton2(length);
break;
case stagDefineBitsJPEG3:
t = decodeDefineJPEG3(length);
break;
case stagDefineBitsLossless2:
t = decodeDefineBitsLossless2(length);
break;
case stagDefineEditText:
t = decodeDefineEditText();
break;
case stagDefineSprite:
t = decodeDefineSprite(pos+length);
break;
case stagDefineScalingGrid:
t = decodeDefineScalingGrid();
break;
case stagFrameLabel:
t = decodeFrameLabel(length);
break;
case stagDefineMorphShape:
t = decodeDefineMorphShape();
break;
case stagDefineMorphShape2:
t = decodeDefineMorphShape2();
break;
case stagDefineFont2:
t = decodeDefineFont2();
break;
case stagDefineFont3:
t = decodeDefineFont3();
break;
case stagDefineFont4:
t = decodeDefineFont4(length);
break;
case stagExportAssets:
t = decodeExportAssets();
break;
case stagImportAssets:
case stagImportAssets2:
t = decodeImportAssets(type);
break;
case stagEnableDebugger2:
case stagEnableDebugger:
t = decodeEnableDebugger(type);
break;
case stagDoInitAction:
t = decodeDoInitAction(length);
break;
case stagDefineVideoStream:
t = decodeDefineVideoStream();
break;
case stagVideoFrame:
t = decodeVideoFrame(length);
break;
case stagDebugID:
t = decodeDebugID(type, length);
break;
case stagScriptLimits:
t = decodeScriptLimits();
break;
case stagSetTabIndex:
t = decodeSetTabIndex();
break;
case stagDoABC:
case stagDoABC2:
t = decodeDoABC(type, length);
break;
case stagSymbolClass:
t = decodeSymbolClass();
break;
case stagFileAttributes:
t = decodeFileAttributes();
break;
case stagEnableTelemetry:
t = decodeEnableTelemetry();
break;
case stagDefineFontAlignZones:
t = decodeDefineFontAlignZones();
break;
case stagCSMTextSettings:
t = decodeCSMTextSettings();
break;
case stagDefineSceneAndFrameLabelData:
t = decodeDefineSceneAndFrameData(length);
break;
case stagDefineFontName:
t = decodeDefineFontName();
break;
default:
t = decodeUnknown(length, type);
break;
}
int consumed = r.getOffset() - pos;
// [preilly] It looks like past Authoring tools have generated some SWF's with
// stagSoundStreamHead tags of length 4 with compression set to mp3, but the tag
// really has 6 bytes in it and the player always reads the 6 bytes, so ignore the
// difference between the consumed and the length for this special case.
if ((consumed != length) && (type == stagSoundStreamHead) && (consumed != (length + 2)))
{
throw new SwfFormatException(TagValues.names[type] + " at pos "+pos+ ": " + consumed +
" bytes were read. " + length + " byte were required.");
}
return t;
}