void nsSpeechTask::SendAudioImpl(nsRefPtr<mozilla::SharedBuffer>& aSamples, uint32_t aDataLen) { if (aDataLen == 0) { mStream->EndAllTrackAndFinish(); return; } AudioSegment segment; nsAutoTArray<const int16_t*, 1> channelData; channelData.AppendElement(static_cast<int16_t*>(aSamples->Data())); segment.AppendFrames(aSamples.forget(), channelData, aDataLen); mStream->AppendToTrack(1, &segment); mStream->AdvanceKnownTracksTime(STREAM_TIME_MAX); }
bool IntelWebMVideoDecoder::Demux(nsRefPtr<VP8Sample>& aSample, bool* aEOS) { nsRefPtr<NesteggPacketHolder> holder(mReader->NextPacket(WebMReader::VIDEO)); if (!holder) { return false; } nestegg_packet* packet = holder->Packet(); unsigned int track = 0; int r = nestegg_packet_track(packet, &track); if (r == -1) { return false; } unsigned int count = 0; r = nestegg_packet_count(packet, &count); if (r == -1) { return false; } if (count > 1) { NS_WARNING("Packet contains more than one video frame"); return false; } int64_t tstamp = holder->Timestamp(); // The end time of this frame is the start time of the next frame. Fetch // the timestamp of the next packet for this track. If we've reached the // end of the resource, use the file's duration as the end time of this // video frame. int64_t next_tstamp = 0; nsRefPtr<NesteggPacketHolder> next_holder(mReader->NextPacket(WebMReader::VIDEO)); if (next_holder) { next_tstamp = holder->Timestamp(); mReader->PushVideoPacket(next_holder); } else { next_tstamp = tstamp; next_tstamp += tstamp - mReader->GetLastVideoFrameTime(); } mReader->SetLastVideoFrameTime(tstamp); unsigned char* data; size_t length; r = nestegg_packet_data(packet, 0, &data, &length); if (r == -1) { return false; } vpx_codec_stream_info_t si; PodZero(&si); si.sz = sizeof(si); if (mReader->GetVideoCodec() == NESTEGG_CODEC_VP8) { vpx_codec_peek_stream_info(vpx_codec_vp8_dx(), data, length, &si); } else if (mReader->GetVideoCodec() == NESTEGG_CODEC_VP9) { vpx_codec_peek_stream_info(vpx_codec_vp9_dx(), data, length, &si); } MOZ_ASSERT(mPlatform && mMediaDataDecoder); aSample = new VP8Sample(tstamp, next_tstamp - tstamp, 0, data, length, si.is_kf); if (!aSample->Data()) { return false; } return true; }