nsresult VP8TrackEncoder::GetEncodedPartitions(EncodedFrameContainer& aData) { vpx_codec_iter_t iter = nullptr; EncodedFrame::FrameType frameType = EncodedFrame::VP8_P_FRAME; nsTArray<uint8_t> frameData; nsresult rv; const vpx_codec_cx_pkt_t *pkt = nullptr; while ((pkt = vpx_codec_get_cx_data(mVPXContext, &iter)) != nullptr) { switch (pkt->kind) { case VPX_CODEC_CX_FRAME_PKT: { // Copy the encoded data from libvpx to frameData frameData.AppendElements((uint8_t*)pkt->data.frame.buf, pkt->data.frame.sz); break; } default: { break; } } // End of frame if ((pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT) == 0) { if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) { frameType = EncodedFrame::VP8_I_FRAME; } break; } } if (!frameData.IsEmpty() && (pkt->data.frame.pts == mEncodedTimestamp)) { // Copy the encoded data to aData. EncodedFrame* videoData = new EncodedFrame(); videoData->SetFrameType(frameType); // Convert the timestamp and duration to Usecs. CheckedInt64 timestamp = FramesToUsecs(mEncodedTimestamp, mTrackRate); if (timestamp.isValid()) { videoData->SetTimeStamp( (uint64_t)FramesToUsecs(mEncodedTimestamp, mTrackRate).value()); } CheckedInt64 duration = FramesToUsecs(pkt->data.frame.duration, mTrackRate); if (duration.isValid()) { videoData->SetDuration( (uint64_t)FramesToUsecs(pkt->data.frame.duration, mTrackRate).value()); } rv = videoData->SwapInFrameData(frameData); NS_ENSURE_SUCCESS(rv, rv); VP8LOG("GetEncodedPartitions TimeStamp %lld Duration %lld\n", videoData->GetTimeStamp(), videoData->GetDuration()); VP8LOG("frameType %d\n", videoData->GetFrameType()); aData.AppendEncodedFrame(videoData); } return NS_OK; }
void VorbisTrackEncoder::GetEncodedFrames(EncodedFrameContainer& aData) { // vorbis does some data preanalysis, then divvies up blocks for // more involved (potentially parallel) processing. Get a single // block for encoding now. while (vorbis_analysis_blockout(&mVorbisDsp, &mVorbisBlock) == 1) { ogg_packet oggPacket; if (vorbis_analysis(&mVorbisBlock, &oggPacket) == 0) { VORBISLOG("vorbis_analysis_blockout block size %d", oggPacket.bytes); EncodedFrame* audiodata = new EncodedFrame(); audiodata->SetFrameType(EncodedFrame::VORBIS_AUDIO_FRAME); nsTArray<uint8_t> frameData; frameData.AppendElements(oggPacket.packet, oggPacket.bytes); audiodata->SwapInFrameData(frameData); aData.AppendEncodedFrame(audiodata); } } }