Example #1
0
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;
}