bool SkeletonState::DecodeHeader(ogg_packet* aPacket) { nsAutoRef<ogg_packet> autoRelease(aPacket); if (IsSkeletonBOS(aPacket)) { uint16_t verMajor = LittleEndian::readUint16(aPacket->packet + SKELETON_VERSION_MAJOR_OFFSET); uint16_t verMinor = LittleEndian::readUint16(aPacket->packet + SKELETON_VERSION_MINOR_OFFSET); // Read the presentation time. We read this before the version check as the // presentation time exists in all versions. int64_t n = LittleEndian::readInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_NUMERATOR_OFFSET); int64_t d = LittleEndian::readInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_DENOMINATOR_OFFSET); mPresentationTime = d == 0 ? 0 : (static_cast<float>(n) / static_cast<float>(d)) * USECS_PER_S; mVersion = SKELETON_VERSION(verMajor, verMinor); // We can only care to parse Skeleton version 4.0+. if (mVersion < SKELETON_VERSION(4,0) || mVersion >= SKELETON_VERSION(5,0) || aPacket->bytes < SKELETON_4_0_MIN_HEADER_LEN) return false; // Extract the segment length. mLength = LittleEndian::readInt64(aPacket->packet + SKELETON_FILE_LENGTH_OFFSET); LOG(PR_LOG_DEBUG, ("Skeleton segment length: %lld", mLength)); // Initialize the serialno-to-index map. return true; } else if (IsSkeletonIndex(aPacket) && mVersion >= SKELETON_VERSION(4,0)) { return DecodeIndex(aPacket); } else if (aPacket->e_o_s) { mDoneReadingHeaders = true; return true; } return true; }
BBGrContext *Win32GLGrDriver2D::createContext( BBGraphics *g ){ Win32GLGraphics *p=dynamic_cast<Win32GLGraphics*>(g); if( !p ) bbError( "Incompatible graphics" ); Context *t=new Context(p); autoRelease(t); return t; }
bool Win32GLGrDriver2D::startup(){ startModule( "Win32GL" ); startModule( "Win32FontDriver" ); _context=0; _graphics=0; _glContext=0; _font=new Win32Font( BBTMPSTR("courier"),10,0 ); autoRelease( _font ); bbSetGrDriver2D( this ); return true; }
bool OpusState::DecodeHeader(ogg_packet* aPacket) { nsAutoRef<ogg_packet> autoRelease(aPacket); switch(mPacketCount++) { // Parse the id header. case 0: { mParser = new OpusParser; if(!mParser->DecodeHeader(aPacket->packet, aPacket->bytes)) { return false; } mRate = mParser->mRate; mChannels = mParser->mChannels; mPreSkip = mParser->mPreSkip; #ifdef MOZ_SAMPLE_TYPE_FLOAT32 mGain = mParser->mGain; #else mGain_Q16 = mParser->mGain_Q16; #endif } break; // Parse the metadata header. case 1: { if(!mParser->DecodeTags(aPacket->packet, aPacket->bytes)) { return false; } } break; // We made it to the first data packet (which includes reconstructing // timestamps for it in PageIn). Success! default: { mDoneReadingHeaders = true; // Put it back on the queue so we can decode it. mPackets.PushFront(autoRelease.disown()); } break; } return true; }
bool VorbisState::DecodeHeader(ogg_packet* aPacket) { nsAutoRef<ogg_packet> autoRelease(aPacket); mPacketCount++; int ret = vorbis_synthesis_headerin(&mInfo, &mComment, aPacket); // We must determine when we've read the last header packet. // vorbis_synthesis_headerin() does not tell us when it's read the last // header, so we must keep track of the headers externally. // // There are 3 header packets, the Identification, Comment, and Setup // headers, which must be in that order. If they're out of order, the file // is invalid. If we've successfully read a header, and it's the setup // header, then we're done reading headers. The first byte of each packet // determines it's type as follows: // 0x1 -> Identification header // 0x3 -> Comment header // 0x5 -> Setup header // For more details of the Vorbis/Ogg containment scheme, see the Vorbis I // Specification, Chapter 4, Codec Setup and Packet Decode: // http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-580004 bool isSetupHeader = aPacket->bytes > 0 && aPacket->packet[0] == 0x5; if (ret < 0 || mPacketCount > 3) { // We've received an error, or the first three packets weren't valid // header packets. Assume bad input. Our caller will deactivate the // bitstream. return false; } else if (ret == 0 && isSetupHeader && mPacketCount == 3) { // Successfully read the three header packets. // The bitstream remains active. mDoneReadingHeaders = true; } return true; }
bool TheoraState::DecodeHeader(ogg_packet* aPacket) { nsAutoRef<ogg_packet> autoRelease(aPacket); mPacketCount++; int ret = th_decode_headerin(&mInfo, &mComment, &mSetup, aPacket); // We must determine when we've read the last header packet. // th_decode_headerin() does not tell us when it's read the last header, so // we must keep track of the headers externally. // // There are 3 header packets, the Identification, Comment, and Setup // headers, which must be in that order. If they're out of order, the file // is invalid. If we've successfully read a header, and it's the setup // header, then we're done reading headers. The first byte of each packet // determines it's type as follows: // 0x80 -> Identification header // 0x81 -> Comment header // 0x82 -> Setup header // See http://www.theora.org/doc/Theora.pdf Chapter 6, "Bitstream Headers", // for more details of the Ogg/Theora containment scheme. bool isSetupHeader = aPacket->bytes > 0 && aPacket->packet[0] == 0x82; if (ret < 0 || mPacketCount > 3) { // We've received an error, or the first three packets weren't valid // header packets. Assume bad input. // Our caller will deactivate the bitstream. return false; } else if (ret > 0 && isSetupHeader && mPacketCount == 3) { // Successfully read the three header packets. mDoneReadingHeaders = true; } return true; }
nsresult GonkVideoDecoderManager::CreateVideoData(MediaBuffer* aBuffer, int64_t aStreamOffset, VideoData **v) { *v = nullptr; RefPtr<VideoData> data; int64_t timeUs; int32_t keyFrame; if (aBuffer == nullptr) { GVDM_LOG("Video Buffer is not valid!"); return NS_ERROR_UNEXPECTED; } AutoReleaseMediaBuffer autoRelease(aBuffer, mDecoder.get()); if (!aBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) { GVDM_LOG("Decoder did not return frame time"); return NS_ERROR_UNEXPECTED; } if (mLastTime > timeUs) { GVDM_LOG("Output decoded sample time is revert. time=%lld", timeUs); return NS_ERROR_NOT_AVAILABLE; } mLastTime = timeUs; if (aBuffer->range_length() == 0) { // Some decoders may return spurious empty buffers that we just want to ignore // quoted from Android's AwesomePlayer.cpp return NS_ERROR_NOT_AVAILABLE; } if (!aBuffer->meta_data()->findInt32(kKeyIsSyncFrame, &keyFrame)) { keyFrame = 0; } gfx::IntRect picture = mPicture; if (mFrameInfo.mWidth != mInitialFrame.width || mFrameInfo.mHeight != mInitialFrame.height) { // Frame size is different from what the container reports. This is legal, // and we will preserve the ratio of the crop rectangle as it // was reported relative to the picture size reported by the container. picture.x = (mPicture.x * mFrameInfo.mWidth) / mInitialFrame.width; picture.y = (mPicture.y * mFrameInfo.mHeight) / mInitialFrame.height; picture.width = (mFrameInfo.mWidth * mPicture.width) / mInitialFrame.width; picture.height = (mFrameInfo.mHeight * mPicture.height) / mInitialFrame.height; } if (aBuffer->graphicBuffer().get()) { data = CreateVideoDataFromGraphicBuffer(aBuffer, picture); if (data && !mNeedsCopyBuffer) { // RecycleCallback() will be responsible for release the buffer. autoRelease.forget(); } mNeedsCopyBuffer = false; } else { data = CreateVideoDataFromDataBuffer(aBuffer, picture); } if (!data) { return NS_ERROR_UNEXPECTED; } // Fill necessary info. data->mOffset = aStreamOffset; data->mTime = timeUs; data->mKeyframe = keyFrame; data.forget(v); return NS_OK; }