mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
09e204851c
--HG-- rename : content/media/AbstractMediaDecoder.h => dom/media/AbstractMediaDecoder.h rename : content/media/AudioBufferUtils.h => dom/media/AudioBufferUtils.h rename : content/media/AudioChannelFormat.cpp => dom/media/AudioChannelFormat.cpp rename : content/media/AudioChannelFormat.h => dom/media/AudioChannelFormat.h rename : content/media/AudioCompactor.cpp => dom/media/AudioCompactor.cpp rename : content/media/AudioCompactor.h => dom/media/AudioCompactor.h rename : content/media/AudioMixer.h => dom/media/AudioMixer.h rename : content/media/AudioSampleFormat.h => dom/media/AudioSampleFormat.h rename : content/media/AudioSegment.cpp => dom/media/AudioSegment.cpp rename : content/media/AudioSegment.h => dom/media/AudioSegment.h rename : content/media/AudioSink.cpp => dom/media/AudioSink.cpp rename : content/media/AudioSink.h => dom/media/AudioSink.h rename : content/media/AudioStream.cpp => dom/media/AudioStream.cpp rename : content/media/AudioStream.h => dom/media/AudioStream.h rename : content/media/AudioStreamTrack.cpp => dom/media/AudioStreamTrack.cpp rename : content/media/AudioStreamTrack.h => dom/media/AudioStreamTrack.h rename : content/media/AudioTrack.cpp => dom/media/AudioTrack.cpp rename : content/media/AudioTrack.h => dom/media/AudioTrack.h rename : content/media/AudioTrackList.cpp => dom/media/AudioTrackList.cpp rename : content/media/AudioTrackList.h => dom/media/AudioTrackList.h rename : content/media/BufferMediaResource.h => dom/media/BufferMediaResource.h rename : content/media/CubebUtils.cpp => dom/media/CubebUtils.cpp rename : content/media/CubebUtils.h => dom/media/CubebUtils.h rename : content/media/DOMMediaStream.cpp => dom/media/DOMMediaStream.cpp rename : content/media/DOMMediaStream.h => dom/media/DOMMediaStream.h rename : content/media/DecoderTraits.cpp => dom/media/DecoderTraits.cpp rename : content/media/DecoderTraits.h => dom/media/DecoderTraits.h rename : content/media/EncodedBufferCache.cpp => dom/media/EncodedBufferCache.cpp rename : content/media/EncodedBufferCache.h => dom/media/EncodedBufferCache.h rename : content/media/FileBlockCache.cpp => dom/media/FileBlockCache.cpp rename : content/media/FileBlockCache.h => dom/media/FileBlockCache.h rename : content/media/GraphDriver.cpp => dom/media/GraphDriver.cpp rename : content/media/GraphDriver.h => dom/media/GraphDriver.h rename : content/media/Latency.cpp => dom/media/Latency.cpp rename : content/media/Latency.h => dom/media/Latency.h rename : content/media/MP3FrameParser.cpp => dom/media/MP3FrameParser.cpp rename : content/media/MP3FrameParser.h => dom/media/MP3FrameParser.h rename : content/media/MediaCache.cpp => dom/media/MediaCache.cpp rename : content/media/MediaCache.h => dom/media/MediaCache.h rename : content/media/MediaData.cpp => dom/media/MediaData.cpp rename : content/media/MediaData.h => dom/media/MediaData.h rename : content/media/MediaDataDecodedListener.h => dom/media/MediaDataDecodedListener.h rename : content/media/MediaDecoder.cpp => dom/media/MediaDecoder.cpp rename : content/media/MediaDecoder.h => dom/media/MediaDecoder.h rename : content/media/MediaDecoderOwner.h => dom/media/MediaDecoderOwner.h rename : content/media/MediaDecoderReader.cpp => dom/media/MediaDecoderReader.cpp rename : content/media/MediaDecoderReader.h => dom/media/MediaDecoderReader.h rename : content/media/MediaDecoderStateMachine.cpp => dom/media/MediaDecoderStateMachine.cpp rename : content/media/MediaDecoderStateMachine.h => dom/media/MediaDecoderStateMachine.h rename : content/media/MediaDecoderStateMachineScheduler.cpp => dom/media/MediaDecoderStateMachineScheduler.cpp rename : content/media/MediaDecoderStateMachineScheduler.h => dom/media/MediaDecoderStateMachineScheduler.h rename : content/media/MediaInfo.h => dom/media/MediaInfo.h rename : content/media/MediaMetadataManager.h => dom/media/MediaMetadataManager.h rename : content/media/MediaQueue.h => dom/media/MediaQueue.h rename : content/media/MediaRecorder.cpp => dom/media/MediaRecorder.cpp rename : content/media/MediaRecorder.h => dom/media/MediaRecorder.h rename : content/media/MediaResource.cpp => dom/media/MediaResource.cpp rename : content/media/MediaResource.h => dom/media/MediaResource.h rename : content/media/MediaSegment.h => dom/media/MediaSegment.h rename : content/media/MediaShutdownManager.cpp => dom/media/MediaShutdownManager.cpp rename : content/media/MediaShutdownManager.h => dom/media/MediaShutdownManager.h rename : content/media/MediaStreamGraph.cpp => dom/media/MediaStreamGraph.cpp rename : content/media/MediaStreamGraph.h => dom/media/MediaStreamGraph.h rename : content/media/MediaStreamGraphImpl.h => dom/media/MediaStreamGraphImpl.h rename : content/media/MediaStreamTrack.cpp => dom/media/MediaStreamTrack.cpp rename : content/media/MediaStreamTrack.h => dom/media/MediaStreamTrack.h rename : content/media/MediaTaskQueue.cpp => dom/media/MediaTaskQueue.cpp rename : content/media/MediaTaskQueue.h => dom/media/MediaTaskQueue.h rename : content/media/MediaTrack.cpp => dom/media/MediaTrack.cpp rename : content/media/MediaTrack.h => dom/media/MediaTrack.h rename : content/media/MediaTrackList.cpp => dom/media/MediaTrackList.cpp rename : content/media/MediaTrackList.h => dom/media/MediaTrackList.h rename : content/media/RtspMediaResource.cpp => dom/media/RtspMediaResource.cpp rename : content/media/RtspMediaResource.h => dom/media/RtspMediaResource.h rename : content/media/SharedBuffer.h => dom/media/SharedBuffer.h rename : content/media/SharedThreadPool.cpp => dom/media/SharedThreadPool.cpp rename : content/media/SharedThreadPool.h => dom/media/SharedThreadPool.h rename : content/media/StreamBuffer.cpp => dom/media/StreamBuffer.cpp rename : content/media/StreamBuffer.h => dom/media/StreamBuffer.h rename : content/media/TextTrack.cpp => dom/media/TextTrack.cpp rename : content/media/TextTrack.h => dom/media/TextTrack.h rename : content/media/TextTrackCue.cpp => dom/media/TextTrackCue.cpp rename : content/media/TextTrackCue.h => dom/media/TextTrackCue.h rename : content/media/TextTrackCueList.cpp => dom/media/TextTrackCueList.cpp rename : content/media/TextTrackCueList.h => dom/media/TextTrackCueList.h rename : content/media/TextTrackList.cpp => dom/media/TextTrackList.cpp rename : content/media/TextTrackList.h => dom/media/TextTrackList.h rename : content/media/TextTrackRegion.cpp => dom/media/TextTrackRegion.cpp rename : content/media/TextTrackRegion.h => dom/media/TextTrackRegion.h rename : content/media/ThreadPoolCOMListener.cpp => dom/media/ThreadPoolCOMListener.cpp rename : content/media/ThreadPoolCOMListener.h => dom/media/ThreadPoolCOMListener.h rename : content/media/TimeVarying.h => dom/media/TimeVarying.h rename : content/media/TrackUnionStream.cpp => dom/media/TrackUnionStream.cpp rename : content/media/TrackUnionStream.h => dom/media/TrackUnionStream.h rename : content/media/VideoFrameContainer.cpp => dom/media/VideoFrameContainer.cpp rename : content/media/VideoFrameContainer.h => dom/media/VideoFrameContainer.h rename : content/media/VideoPlaybackQuality.cpp => dom/media/VideoPlaybackQuality.cpp rename : content/media/VideoPlaybackQuality.h => dom/media/VideoPlaybackQuality.h rename : content/media/VideoSegment.cpp => dom/media/VideoSegment.cpp rename : content/media/VideoSegment.h => dom/media/VideoSegment.h rename : content/media/VideoStreamTrack.cpp => dom/media/VideoStreamTrack.cpp rename : content/media/VideoStreamTrack.h => dom/media/VideoStreamTrack.h rename : content/media/VideoTrack.cpp => dom/media/VideoTrack.cpp rename : content/media/VideoTrack.h => dom/media/VideoTrack.h rename : content/media/VideoTrackList.cpp => dom/media/VideoTrackList.cpp rename : content/media/VideoTrackList.h => dom/media/VideoTrackList.h rename : content/media/VideoUtils.cpp => dom/media/VideoUtils.cpp rename : content/media/VideoUtils.h => dom/media/VideoUtils.h rename : content/media/VorbisUtils.h => dom/media/VorbisUtils.h rename : content/media/WebVTTListener.cpp => dom/media/WebVTTListener.cpp rename : content/media/WebVTTListener.h => dom/media/WebVTTListener.h rename : content/media/android/AndroidMediaDecoder.cpp => dom/media/android/AndroidMediaDecoder.cpp rename : content/media/android/AndroidMediaDecoder.h => dom/media/android/AndroidMediaDecoder.h rename : content/media/android/AndroidMediaPluginHost.cpp => dom/media/android/AndroidMediaPluginHost.cpp rename : content/media/android/AndroidMediaPluginHost.h => dom/media/android/AndroidMediaPluginHost.h rename : content/media/android/AndroidMediaReader.cpp => dom/media/android/AndroidMediaReader.cpp rename : content/media/android/AndroidMediaReader.h => dom/media/android/AndroidMediaReader.h rename : content/media/android/AndroidMediaResourceServer.cpp => dom/media/android/AndroidMediaResourceServer.cpp rename : content/media/android/AndroidMediaResourceServer.h => dom/media/android/AndroidMediaResourceServer.h rename : content/media/android/MPAPI.h => dom/media/android/MPAPI.h rename : content/media/android/moz.build => dom/media/android/moz.build rename : content/media/apple/AppleDecoder.cpp => dom/media/apple/AppleDecoder.cpp rename : content/media/apple/AppleDecoder.h => dom/media/apple/AppleDecoder.h rename : content/media/apple/AppleMP3Reader.cpp => dom/media/apple/AppleMP3Reader.cpp rename : content/media/apple/AppleMP3Reader.h => dom/media/apple/AppleMP3Reader.h rename : content/media/apple/moz.build => dom/media/apple/moz.build rename : content/media/compiledtest/TestAudioBuffers.cpp => dom/media/compiledtest/TestAudioBuffers.cpp rename : content/media/compiledtest/TestAudioMixer.cpp => dom/media/compiledtest/TestAudioMixer.cpp rename : content/media/compiledtest/moz.build => dom/media/compiledtest/moz.build rename : content/media/directshow/AudioSinkFilter.cpp => dom/media/directshow/AudioSinkFilter.cpp rename : content/media/directshow/AudioSinkFilter.h => dom/media/directshow/AudioSinkFilter.h rename : content/media/directshow/AudioSinkInputPin.cpp => dom/media/directshow/AudioSinkInputPin.cpp rename : content/media/directshow/AudioSinkInputPin.h => dom/media/directshow/AudioSinkInputPin.h rename : content/media/directshow/DirectShowDecoder.cpp => dom/media/directshow/DirectShowDecoder.cpp rename : content/media/directshow/DirectShowDecoder.h => dom/media/directshow/DirectShowDecoder.h rename : content/media/directshow/DirectShowReader.cpp => dom/media/directshow/DirectShowReader.cpp rename : content/media/directshow/DirectShowReader.h => dom/media/directshow/DirectShowReader.h rename : content/media/directshow/DirectShowUtils.cpp => dom/media/directshow/DirectShowUtils.cpp rename : content/media/directshow/DirectShowUtils.h => dom/media/directshow/DirectShowUtils.h rename : content/media/directshow/SampleSink.cpp => dom/media/directshow/SampleSink.cpp rename : content/media/directshow/SampleSink.h => dom/media/directshow/SampleSink.h rename : content/media/directshow/SourceFilter.cpp => dom/media/directshow/SourceFilter.cpp rename : content/media/directshow/SourceFilter.h => dom/media/directshow/SourceFilter.h rename : content/media/directshow/moz.build => dom/media/directshow/moz.build rename : content/media/eme/CDMCallbackProxy.cpp => dom/media/eme/CDMCallbackProxy.cpp rename : content/media/eme/CDMCallbackProxy.h => dom/media/eme/CDMCallbackProxy.h rename : content/media/eme/CDMCaps.cpp => dom/media/eme/CDMCaps.cpp rename : content/media/eme/CDMCaps.h => dom/media/eme/CDMCaps.h rename : content/media/eme/CDMProxy.cpp => dom/media/eme/CDMProxy.cpp rename : content/media/eme/CDMProxy.h => dom/media/eme/CDMProxy.h rename : content/media/eme/EMELog.cpp => dom/media/eme/EMELog.cpp rename : content/media/eme/EMELog.h => dom/media/eme/EMELog.h rename : content/media/eme/MediaEncryptedEvent.cpp => dom/media/eme/MediaEncryptedEvent.cpp rename : content/media/eme/MediaEncryptedEvent.h => dom/media/eme/MediaEncryptedEvent.h rename : content/media/eme/MediaKeyError.cpp => dom/media/eme/MediaKeyError.cpp rename : content/media/eme/MediaKeyError.h => dom/media/eme/MediaKeyError.h rename : content/media/eme/MediaKeyMessageEvent.cpp => dom/media/eme/MediaKeyMessageEvent.cpp rename : content/media/eme/MediaKeyMessageEvent.h => dom/media/eme/MediaKeyMessageEvent.h rename : content/media/eme/MediaKeySession.cpp => dom/media/eme/MediaKeySession.cpp rename : content/media/eme/MediaKeySession.h => dom/media/eme/MediaKeySession.h rename : content/media/eme/MediaKeys.cpp => dom/media/eme/MediaKeys.cpp rename : content/media/eme/MediaKeys.h => dom/media/eme/MediaKeys.h rename : content/media/eme/moz.build => dom/media/eme/moz.build rename : content/media/encoder/ContainerWriter.h => dom/media/encoder/ContainerWriter.h rename : content/media/encoder/EncodedFrameContainer.h => dom/media/encoder/EncodedFrameContainer.h rename : content/media/encoder/MediaEncoder.cpp => dom/media/encoder/MediaEncoder.cpp rename : content/media/encoder/MediaEncoder.h => dom/media/encoder/MediaEncoder.h rename : content/media/encoder/OmxTrackEncoder.cpp => dom/media/encoder/OmxTrackEncoder.cpp rename : content/media/encoder/OmxTrackEncoder.h => dom/media/encoder/OmxTrackEncoder.h rename : content/media/encoder/OpusTrackEncoder.cpp => dom/media/encoder/OpusTrackEncoder.cpp rename : content/media/encoder/OpusTrackEncoder.h => dom/media/encoder/OpusTrackEncoder.h rename : content/media/encoder/TrackEncoder.cpp => dom/media/encoder/TrackEncoder.cpp rename : content/media/encoder/TrackEncoder.h => dom/media/encoder/TrackEncoder.h rename : content/media/encoder/TrackMetadataBase.h => dom/media/encoder/TrackMetadataBase.h rename : content/media/encoder/VP8TrackEncoder.cpp => dom/media/encoder/VP8TrackEncoder.cpp rename : content/media/encoder/VP8TrackEncoder.h => dom/media/encoder/VP8TrackEncoder.h rename : content/media/encoder/VorbisTrackEncoder.cpp => dom/media/encoder/VorbisTrackEncoder.cpp rename : content/media/encoder/VorbisTrackEncoder.h => dom/media/encoder/VorbisTrackEncoder.h rename : content/media/encoder/fmp4_muxer/AMRBox.cpp => dom/media/encoder/fmp4_muxer/AMRBox.cpp rename : content/media/encoder/fmp4_muxer/AMRBox.h => dom/media/encoder/fmp4_muxer/AMRBox.h rename : content/media/encoder/fmp4_muxer/AVCBox.cpp => dom/media/encoder/fmp4_muxer/AVCBox.cpp rename : content/media/encoder/fmp4_muxer/AVCBox.h => dom/media/encoder/fmp4_muxer/AVCBox.h rename : content/media/encoder/fmp4_muxer/ISOControl.cpp => dom/media/encoder/fmp4_muxer/ISOControl.cpp rename : content/media/encoder/fmp4_muxer/ISOControl.h => dom/media/encoder/fmp4_muxer/ISOControl.h rename : content/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp => dom/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp rename : content/media/encoder/fmp4_muxer/ISOMediaBoxes.h => dom/media/encoder/fmp4_muxer/ISOMediaBoxes.h rename : content/media/encoder/fmp4_muxer/ISOMediaWriter.cpp => dom/media/encoder/fmp4_muxer/ISOMediaWriter.cpp rename : content/media/encoder/fmp4_muxer/ISOMediaWriter.h => dom/media/encoder/fmp4_muxer/ISOMediaWriter.h rename : content/media/encoder/fmp4_muxer/ISOTrackMetadata.h => dom/media/encoder/fmp4_muxer/ISOTrackMetadata.h rename : content/media/encoder/fmp4_muxer/MP4ESDS.cpp => dom/media/encoder/fmp4_muxer/MP4ESDS.cpp rename : content/media/encoder/fmp4_muxer/MP4ESDS.h => dom/media/encoder/fmp4_muxer/MP4ESDS.h rename : content/media/encoder/fmp4_muxer/MuxerOperation.h => dom/media/encoder/fmp4_muxer/MuxerOperation.h rename : content/media/encoder/fmp4_muxer/moz.build => dom/media/encoder/fmp4_muxer/moz.build rename : content/media/encoder/moz.build => dom/media/encoder/moz.build rename : content/media/fmp4/BlankDecoderModule.cpp => dom/media/fmp4/BlankDecoderModule.cpp rename : content/media/fmp4/MP4Decoder.cpp => dom/media/fmp4/MP4Decoder.cpp rename : content/media/fmp4/MP4Decoder.h => dom/media/fmp4/MP4Decoder.h rename : content/media/fmp4/MP4Reader.cpp => dom/media/fmp4/MP4Reader.cpp rename : content/media/fmp4/MP4Reader.h => dom/media/fmp4/MP4Reader.h rename : content/media/fmp4/PlatformDecoderModule.cpp => dom/media/fmp4/PlatformDecoderModule.cpp rename : content/media/fmp4/PlatformDecoderModule.h => dom/media/fmp4/PlatformDecoderModule.h rename : content/media/fmp4/android/AndroidDecoderModule.cpp => dom/media/fmp4/android/AndroidDecoderModule.cpp rename : content/media/fmp4/android/AndroidDecoderModule.h => dom/media/fmp4/android/AndroidDecoderModule.h rename : content/media/fmp4/apple/AppleATDecoder.cpp => dom/media/fmp4/apple/AppleATDecoder.cpp rename : content/media/fmp4/apple/AppleATDecoder.h => dom/media/fmp4/apple/AppleATDecoder.h rename : content/media/fmp4/apple/AppleCMFunctions.h => dom/media/fmp4/apple/AppleCMFunctions.h rename : content/media/fmp4/apple/AppleCMLinker.cpp => dom/media/fmp4/apple/AppleCMLinker.cpp rename : content/media/fmp4/apple/AppleCMLinker.h => dom/media/fmp4/apple/AppleCMLinker.h rename : content/media/fmp4/apple/AppleDecoderModule.cpp => dom/media/fmp4/apple/AppleDecoderModule.cpp rename : content/media/fmp4/apple/AppleDecoderModule.h => dom/media/fmp4/apple/AppleDecoderModule.h rename : content/media/fmp4/apple/AppleUtils.cpp => dom/media/fmp4/apple/AppleUtils.cpp rename : content/media/fmp4/apple/AppleUtils.h => dom/media/fmp4/apple/AppleUtils.h rename : content/media/fmp4/apple/AppleVDADecoder.cpp => dom/media/fmp4/apple/AppleVDADecoder.cpp rename : content/media/fmp4/apple/AppleVDADecoder.h => dom/media/fmp4/apple/AppleVDADecoder.h rename : content/media/fmp4/apple/AppleVDAFunctions.h => dom/media/fmp4/apple/AppleVDAFunctions.h rename : content/media/fmp4/apple/AppleVDALinker.cpp => dom/media/fmp4/apple/AppleVDALinker.cpp rename : content/media/fmp4/apple/AppleVDALinker.h => dom/media/fmp4/apple/AppleVDALinker.h rename : content/media/fmp4/apple/AppleVTDecoder.cpp => dom/media/fmp4/apple/AppleVTDecoder.cpp rename : content/media/fmp4/apple/AppleVTDecoder.h => dom/media/fmp4/apple/AppleVTDecoder.h rename : content/media/fmp4/apple/AppleVTFunctions.h => dom/media/fmp4/apple/AppleVTFunctions.h rename : content/media/fmp4/apple/AppleVTLinker.cpp => dom/media/fmp4/apple/AppleVTLinker.cpp rename : content/media/fmp4/apple/AppleVTLinker.h => dom/media/fmp4/apple/AppleVTLinker.h rename : content/media/fmp4/apple/ReorderQueue.h => dom/media/fmp4/apple/ReorderQueue.h rename : content/media/fmp4/apple/VideoDecodeAcceleration/VDADecoder.h => dom/media/fmp4/apple/VideoDecodeAcceleration/VDADecoder.h rename : content/media/fmp4/apple/VideoToolbox/VideoToolbox.h => dom/media/fmp4/apple/VideoToolbox/VideoToolbox.h rename : content/media/fmp4/eme/EMEAudioDecoder.cpp => dom/media/fmp4/eme/EMEAudioDecoder.cpp rename : content/media/fmp4/eme/EMEAudioDecoder.h => dom/media/fmp4/eme/EMEAudioDecoder.h rename : content/media/fmp4/eme/EMEDecoderModule.cpp => dom/media/fmp4/eme/EMEDecoderModule.cpp rename : content/media/fmp4/eme/EMEDecoderModule.h => dom/media/fmp4/eme/EMEDecoderModule.h rename : content/media/fmp4/eme/EMEH264Decoder.cpp => dom/media/fmp4/eme/EMEH264Decoder.cpp rename : content/media/fmp4/eme/EMEH264Decoder.h => dom/media/fmp4/eme/EMEH264Decoder.h rename : content/media/fmp4/eme/moz.build => dom/media/fmp4/eme/moz.build rename : content/media/fmp4/ffmpeg/FFmpegAudioDecoder.cpp => dom/media/fmp4/ffmpeg/FFmpegAudioDecoder.cpp rename : content/media/fmp4/ffmpeg/FFmpegAudioDecoder.h => dom/media/fmp4/ffmpeg/FFmpegAudioDecoder.h rename : content/media/fmp4/ffmpeg/FFmpegDataDecoder.cpp => dom/media/fmp4/ffmpeg/FFmpegDataDecoder.cpp rename : content/media/fmp4/ffmpeg/FFmpegDataDecoder.h => dom/media/fmp4/ffmpeg/FFmpegDataDecoder.h rename : content/media/fmp4/ffmpeg/FFmpegDecoderModule.cpp => dom/media/fmp4/ffmpeg/FFmpegDecoderModule.cpp rename : content/media/fmp4/ffmpeg/FFmpegDecoderModule.h => dom/media/fmp4/ffmpeg/FFmpegDecoderModule.h rename : content/media/fmp4/ffmpeg/FFmpegFunctionList.h => dom/media/fmp4/ffmpeg/FFmpegFunctionList.h rename : content/media/fmp4/ffmpeg/FFmpegH264Decoder.cpp => dom/media/fmp4/ffmpeg/FFmpegH264Decoder.cpp rename : content/media/fmp4/ffmpeg/FFmpegH264Decoder.h => dom/media/fmp4/ffmpeg/FFmpegH264Decoder.h rename : content/media/fmp4/ffmpeg/FFmpegLibs.h => dom/media/fmp4/ffmpeg/FFmpegLibs.h rename : content/media/fmp4/ffmpeg/FFmpegLog.cpp => dom/media/fmp4/ffmpeg/FFmpegLog.cpp rename : content/media/fmp4/ffmpeg/FFmpegLog.h => dom/media/fmp4/ffmpeg/FFmpegLog.h rename : content/media/fmp4/ffmpeg/FFmpegRuntimeLinker.cpp => dom/media/fmp4/ffmpeg/FFmpegRuntimeLinker.cpp rename : content/media/fmp4/ffmpeg/FFmpegRuntimeLinker.h => dom/media/fmp4/ffmpeg/FFmpegRuntimeLinker.h rename : content/media/fmp4/ffmpeg/README_mozilla => dom/media/fmp4/ffmpeg/README_mozilla rename : content/media/fmp4/ffmpeg/libav53/include/COPYING.LGPLv2.1 => dom/media/fmp4/ffmpeg/libav53/include/COPYING.LGPLv2.1 rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/avcodec.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/avcodec.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/avfft.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/avfft.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/dxva2.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/dxva2.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/old_codec_ids.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/old_codec_ids.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/opt.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/opt.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/vaapi.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/vaapi.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/vda.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/vda.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/vdpau.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/vdpau.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/version.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/version.h rename : content/media/fmp4/ffmpeg/libav53/include/libavcodec/xvmc.h => dom/media/fmp4/ffmpeg/libav53/include/libavcodec/xvmc.h rename : content/media/fmp4/ffmpeg/libav53/include/libavformat/avformat.h => dom/media/fmp4/ffmpeg/libav53/include/libavformat/avformat.h rename : content/media/fmp4/ffmpeg/libav53/include/libavformat/avio.h => dom/media/fmp4/ffmpeg/libav53/include/libavformat/avio.h rename : content/media/fmp4/ffmpeg/libav53/include/libavformat/version.h => dom/media/fmp4/ffmpeg/libav53/include/libavformat/version.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/adler32.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/adler32.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/aes.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/aes.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/attributes.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/attributes.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/audio_fifo.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/audio_fifo.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/audioconvert.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/audioconvert.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/avassert.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/avassert.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/avconfig.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/avconfig.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/avstring.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/avstring.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/avutil.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/avutil.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/base64.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/base64.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/blowfish.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/blowfish.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/bprint.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/bprint.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/bswap.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/bswap.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/common.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/common.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/cpu.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/cpu.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/crc.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/crc.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/dict.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/dict.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/error.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/error.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/eval.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/eval.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/fifo.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/fifo.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/file.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/file.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/imgutils.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/imgutils.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/intfloat.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/intfloat.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/intfloat_readwrite.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/intfloat_readwrite.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/intreadwrite.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/intreadwrite.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/lfg.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/lfg.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/log.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/log.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/lzo.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/lzo.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/mathematics.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/mathematics.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/md5.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/md5.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/mem.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/mem.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/old_pix_fmts.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/old_pix_fmts.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/opt.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/opt.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/parseutils.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/parseutils.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/pixdesc.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/pixdesc.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/pixfmt.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/pixfmt.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/random_seed.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/random_seed.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/rational.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/rational.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/samplefmt.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/samplefmt.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/sha.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/sha.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/time.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/time.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/timecode.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/timecode.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/timestamp.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/timestamp.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/version.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/version.h rename : content/media/fmp4/ffmpeg/libav53/include/libavutil/xtea.h => dom/media/fmp4/ffmpeg/libav53/include/libavutil/xtea.h rename : content/media/fmp4/ffmpeg/libav53/moz.build => dom/media/fmp4/ffmpeg/libav53/moz.build rename : content/media/fmp4/ffmpeg/libav54/include/COPYING.LGPLv2.1 => dom/media/fmp4/ffmpeg/libav54/include/COPYING.LGPLv2.1 rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/avcodec.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/avcodec.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/avfft.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/avfft.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/dxva2.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/dxva2.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/old_codec_ids.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/old_codec_ids.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/vaapi.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/vaapi.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/vda.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/vda.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/vdpau.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/vdpau.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/version.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/version.h rename : content/media/fmp4/ffmpeg/libav54/include/libavcodec/xvmc.h => dom/media/fmp4/ffmpeg/libav54/include/libavcodec/xvmc.h rename : content/media/fmp4/ffmpeg/libav54/include/libavformat/avformat.h => dom/media/fmp4/ffmpeg/libav54/include/libavformat/avformat.h rename : content/media/fmp4/ffmpeg/libav54/include/libavformat/avio.h => dom/media/fmp4/ffmpeg/libav54/include/libavformat/avio.h rename : content/media/fmp4/ffmpeg/libav54/include/libavformat/version.h => dom/media/fmp4/ffmpeg/libav54/include/libavformat/version.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/adler32.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/adler32.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/aes.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/aes.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/attributes.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/attributes.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/audio_fifo.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/audio_fifo.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/audioconvert.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/audioconvert.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/avassert.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/avassert.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/avconfig.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/avconfig.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/avstring.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/avstring.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/avutil.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/avutil.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/base64.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/base64.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/blowfish.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/blowfish.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/bswap.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/bswap.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/channel_layout.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/channel_layout.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/common.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/common.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/cpu.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/cpu.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/crc.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/crc.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/dict.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/dict.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/error.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/error.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/eval.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/eval.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/fifo.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/fifo.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/file.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/file.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/imgutils.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/imgutils.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/intfloat.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/intfloat.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/intfloat_readwrite.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/intfloat_readwrite.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/intreadwrite.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/intreadwrite.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/lfg.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/lfg.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/log.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/log.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/lzo.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/lzo.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/mathematics.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/mathematics.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/md5.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/md5.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/mem.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/mem.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/old_pix_fmts.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/old_pix_fmts.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/opt.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/opt.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/parseutils.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/parseutils.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/pixdesc.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/pixdesc.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/pixfmt.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/pixfmt.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/random_seed.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/random_seed.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/rational.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/rational.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/samplefmt.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/samplefmt.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/sha.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/sha.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/time.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/time.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/version.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/version.h rename : content/media/fmp4/ffmpeg/libav54/include/libavutil/xtea.h => dom/media/fmp4/ffmpeg/libav54/include/libavutil/xtea.h rename : content/media/fmp4/ffmpeg/libav54/moz.build => dom/media/fmp4/ffmpeg/libav54/moz.build rename : content/media/fmp4/ffmpeg/libav55/include/COPYING.LGPLv2.1 => dom/media/fmp4/ffmpeg/libav55/include/COPYING.LGPLv2.1 rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/avcodec.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/avcodec.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/avfft.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/avfft.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/dxva2.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/dxva2.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/vaapi.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/vaapi.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/vda.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/vda.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/vdpau.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/vdpau.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/version.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/version.h rename : content/media/fmp4/ffmpeg/libav55/include/libavcodec/xvmc.h => dom/media/fmp4/ffmpeg/libav55/include/libavcodec/xvmc.h rename : content/media/fmp4/ffmpeg/libav55/include/libavformat/avformat.h => dom/media/fmp4/ffmpeg/libav55/include/libavformat/avformat.h rename : content/media/fmp4/ffmpeg/libav55/include/libavformat/avio.h => dom/media/fmp4/ffmpeg/libav55/include/libavformat/avio.h rename : content/media/fmp4/ffmpeg/libav55/include/libavformat/version.h => dom/media/fmp4/ffmpeg/libav55/include/libavformat/version.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/adler32.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/adler32.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/aes.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/aes.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/attributes.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/attributes.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/audio_fifo.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/audio_fifo.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/audioconvert.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/audioconvert.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/avassert.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/avassert.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/avconfig.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/avconfig.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/avstring.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/avstring.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/avutil.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/avutil.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/base64.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/base64.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/blowfish.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/blowfish.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/bswap.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/bswap.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/buffer.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/buffer.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/channel_layout.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/channel_layout.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/common.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/common.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/cpu.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/cpu.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/crc.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/crc.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/dict.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/dict.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/downmix_info.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/downmix_info.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/error.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/error.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/eval.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/eval.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/fifo.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/fifo.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/file.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/file.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/frame.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/frame.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/hmac.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/hmac.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/imgutils.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/imgutils.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/intfloat.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/intfloat.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/intreadwrite.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/intreadwrite.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/lfg.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/lfg.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/log.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/log.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/lzo.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/lzo.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/macros.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/macros.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/mathematics.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/mathematics.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/md5.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/md5.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/mem.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/mem.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/old_pix_fmts.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/old_pix_fmts.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/opt.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/opt.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/parseutils.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/parseutils.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/pixdesc.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/pixdesc.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/pixfmt.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/pixfmt.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/random_seed.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/random_seed.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/rational.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/rational.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/samplefmt.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/samplefmt.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/sha.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/sha.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/stereo3d.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/stereo3d.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/time.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/time.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/version.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/version.h rename : content/media/fmp4/ffmpeg/libav55/include/libavutil/xtea.h => dom/media/fmp4/ffmpeg/libav55/include/libavutil/xtea.h rename : content/media/fmp4/ffmpeg/libav55/moz.build => dom/media/fmp4/ffmpeg/libav55/moz.build rename : content/media/fmp4/gonk/GonkAudioDecoderManager.cpp => dom/media/fmp4/gonk/GonkAudioDecoderManager.cpp rename : content/media/fmp4/gonk/GonkAudioDecoderManager.h => dom/media/fmp4/gonk/GonkAudioDecoderManager.h rename : content/media/fmp4/gonk/GonkDecoderModule.cpp => dom/media/fmp4/gonk/GonkDecoderModule.cpp rename : content/media/fmp4/gonk/GonkDecoderModule.h => dom/media/fmp4/gonk/GonkDecoderModule.h rename : content/media/fmp4/gonk/GonkMediaDataDecoder.cpp => dom/media/fmp4/gonk/GonkMediaDataDecoder.cpp rename : content/media/fmp4/gonk/GonkMediaDataDecoder.h => dom/media/fmp4/gonk/GonkMediaDataDecoder.h rename : content/media/fmp4/gonk/GonkVideoDecoderManager.cpp => dom/media/fmp4/gonk/GonkVideoDecoderManager.cpp rename : content/media/fmp4/gonk/GonkVideoDecoderManager.h => dom/media/fmp4/gonk/GonkVideoDecoderManager.h rename : content/media/fmp4/gonk/moz.build => dom/media/fmp4/gonk/moz.build rename : content/media/fmp4/moz.build => dom/media/fmp4/moz.build rename : content/media/fmp4/wmf/MFTDecoder.cpp => dom/media/fmp4/wmf/MFTDecoder.cpp rename : content/media/fmp4/wmf/MFTDecoder.h => dom/media/fmp4/wmf/MFTDecoder.h rename : content/media/fmp4/wmf/WMFAudioMFTManager.cpp => dom/media/fmp4/wmf/WMFAudioMFTManager.cpp rename : content/media/fmp4/wmf/WMFAudioMFTManager.h => dom/media/fmp4/wmf/WMFAudioMFTManager.h rename : content/media/fmp4/wmf/WMFDecoderModule.cpp => dom/media/fmp4/wmf/WMFDecoderModule.cpp rename : content/media/fmp4/wmf/WMFDecoderModule.h => dom/media/fmp4/wmf/WMFDecoderModule.h rename : content/media/fmp4/wmf/WMFMediaDataDecoder.cpp => dom/media/fmp4/wmf/WMFMediaDataDecoder.cpp rename : content/media/fmp4/wmf/WMFMediaDataDecoder.h => dom/media/fmp4/wmf/WMFMediaDataDecoder.h rename : content/media/fmp4/wmf/WMFVideoMFTManager.cpp => dom/media/fmp4/wmf/WMFVideoMFTManager.cpp rename : content/media/fmp4/wmf/WMFVideoMFTManager.h => dom/media/fmp4/wmf/WMFVideoMFTManager.h rename : content/media/fmp4/wmf/moz.build => dom/media/fmp4/wmf/moz.build rename : content/media/gmp/GMPAudioDecoderChild.cpp => dom/media/gmp/GMPAudioDecoderChild.cpp rename : content/media/gmp/GMPAudioDecoderChild.h => dom/media/gmp/GMPAudioDecoderChild.h rename : content/media/gmp/GMPAudioDecoderParent.cpp => dom/media/gmp/GMPAudioDecoderParent.cpp rename : content/media/gmp/GMPAudioDecoderParent.h => dom/media/gmp/GMPAudioDecoderParent.h rename : content/media/gmp/GMPAudioDecoderProxy.h => dom/media/gmp/GMPAudioDecoderProxy.h rename : content/media/gmp/GMPAudioHost.cpp => dom/media/gmp/GMPAudioHost.cpp rename : content/media/gmp/GMPAudioHost.h => dom/media/gmp/GMPAudioHost.h rename : content/media/gmp/GMPCallbackBase.h => dom/media/gmp/GMPCallbackBase.h rename : content/media/gmp/GMPChild.cpp => dom/media/gmp/GMPChild.cpp rename : content/media/gmp/GMPChild.h => dom/media/gmp/GMPChild.h rename : content/media/gmp/GMPDecryptorChild.cpp => dom/media/gmp/GMPDecryptorChild.cpp rename : content/media/gmp/GMPDecryptorChild.h => dom/media/gmp/GMPDecryptorChild.h rename : content/media/gmp/GMPDecryptorParent.cpp => dom/media/gmp/GMPDecryptorParent.cpp rename : content/media/gmp/GMPDecryptorParent.h => dom/media/gmp/GMPDecryptorParent.h rename : content/media/gmp/GMPDecryptorProxy.h => dom/media/gmp/GMPDecryptorProxy.h rename : content/media/gmp/GMPEncryptedBufferDataImpl.cpp => dom/media/gmp/GMPEncryptedBufferDataImpl.cpp rename : content/media/gmp/GMPEncryptedBufferDataImpl.h => dom/media/gmp/GMPEncryptedBufferDataImpl.h rename : content/media/gmp/GMPMessageUtils.h => dom/media/gmp/GMPMessageUtils.h rename : content/media/gmp/GMPParent.cpp => dom/media/gmp/GMPParent.cpp rename : content/media/gmp/GMPParent.h => dom/media/gmp/GMPParent.h rename : content/media/gmp/GMPPlatform.cpp => dom/media/gmp/GMPPlatform.cpp rename : content/media/gmp/GMPPlatform.h => dom/media/gmp/GMPPlatform.h rename : content/media/gmp/GMPProcessChild.cpp => dom/media/gmp/GMPProcessChild.cpp rename : content/media/gmp/GMPProcessChild.h => dom/media/gmp/GMPProcessChild.h rename : content/media/gmp/GMPProcessParent.cpp => dom/media/gmp/GMPProcessParent.cpp rename : content/media/gmp/GMPProcessParent.h => dom/media/gmp/GMPProcessParent.h rename : content/media/gmp/GMPService.cpp => dom/media/gmp/GMPService.cpp rename : content/media/gmp/GMPService.h => dom/media/gmp/GMPService.h rename : content/media/gmp/GMPSharedMemManager.cpp => dom/media/gmp/GMPSharedMemManager.cpp rename : content/media/gmp/GMPSharedMemManager.h => dom/media/gmp/GMPSharedMemManager.h rename : content/media/gmp/GMPStorageChild.cpp => dom/media/gmp/GMPStorageChild.cpp rename : content/media/gmp/GMPStorageChild.h => dom/media/gmp/GMPStorageChild.h rename : content/media/gmp/GMPStorageParent.cpp => dom/media/gmp/GMPStorageParent.cpp rename : content/media/gmp/GMPStorageParent.h => dom/media/gmp/GMPStorageParent.h rename : content/media/gmp/GMPTimerChild.cpp => dom/media/gmp/GMPTimerChild.cpp rename : content/media/gmp/GMPTimerChild.h => dom/media/gmp/GMPTimerChild.h rename : content/media/gmp/GMPTimerParent.cpp => dom/media/gmp/GMPTimerParent.cpp rename : content/media/gmp/GMPTimerParent.h => dom/media/gmp/GMPTimerParent.h rename : content/media/gmp/GMPTypes.ipdlh => dom/media/gmp/GMPTypes.ipdlh rename : content/media/gmp/GMPVideoDecoderChild.cpp => dom/media/gmp/GMPVideoDecoderChild.cpp rename : content/media/gmp/GMPVideoDecoderChild.h => dom/media/gmp/GMPVideoDecoderChild.h rename : content/media/gmp/GMPVideoDecoderParent.cpp => dom/media/gmp/GMPVideoDecoderParent.cpp rename : content/media/gmp/GMPVideoDecoderParent.h => dom/media/gmp/GMPVideoDecoderParent.h rename : content/media/gmp/GMPVideoDecoderProxy.h => dom/media/gmp/GMPVideoDecoderProxy.h rename : content/media/gmp/GMPVideoEncodedFrameImpl.cpp => dom/media/gmp/GMPVideoEncodedFrameImpl.cpp rename : content/media/gmp/GMPVideoEncodedFrameImpl.h => dom/media/gmp/GMPVideoEncodedFrameImpl.h rename : content/media/gmp/GMPVideoEncoderChild.cpp => dom/media/gmp/GMPVideoEncoderChild.cpp rename : content/media/gmp/GMPVideoEncoderChild.h => dom/media/gmp/GMPVideoEncoderChild.h rename : content/media/gmp/GMPVideoEncoderParent.cpp => dom/media/gmp/GMPVideoEncoderParent.cpp rename : content/media/gmp/GMPVideoEncoderParent.h => dom/media/gmp/GMPVideoEncoderParent.h rename : content/media/gmp/GMPVideoEncoderProxy.h => dom/media/gmp/GMPVideoEncoderProxy.h rename : content/media/gmp/GMPVideoHost.cpp => dom/media/gmp/GMPVideoHost.cpp rename : content/media/gmp/GMPVideoHost.h => dom/media/gmp/GMPVideoHost.h rename : content/media/gmp/GMPVideoPlaneImpl.cpp => dom/media/gmp/GMPVideoPlaneImpl.cpp rename : content/media/gmp/GMPVideoPlaneImpl.h => dom/media/gmp/GMPVideoPlaneImpl.h rename : content/media/gmp/GMPVideoi420FrameImpl.cpp => dom/media/gmp/GMPVideoi420FrameImpl.cpp rename : content/media/gmp/GMPVideoi420FrameImpl.h => dom/media/gmp/GMPVideoi420FrameImpl.h rename : content/media/gmp/PGMP.ipdl => dom/media/gmp/PGMP.ipdl rename : content/media/gmp/PGMPAudioDecoder.ipdl => dom/media/gmp/PGMPAudioDecoder.ipdl rename : content/media/gmp/PGMPDecryptor.ipdl => dom/media/gmp/PGMPDecryptor.ipdl rename : content/media/gmp/PGMPStorage.ipdl => dom/media/gmp/PGMPStorage.ipdl rename : content/media/gmp/PGMPTimer.ipdl => dom/media/gmp/PGMPTimer.ipdl rename : content/media/gmp/PGMPVideoDecoder.ipdl => dom/media/gmp/PGMPVideoDecoder.ipdl rename : content/media/gmp/PGMPVideoEncoder.ipdl => dom/media/gmp/PGMPVideoEncoder.ipdl rename : content/media/gmp/README.txt => dom/media/gmp/README.txt rename : content/media/gmp/gmp-api/gmp-async-shutdown.h => dom/media/gmp/gmp-api/gmp-async-shutdown.h rename : content/media/gmp/gmp-api/gmp-audio-codec.h => dom/media/gmp/gmp-api/gmp-audio-codec.h rename : content/media/gmp/gmp-api/gmp-audio-decode.h => dom/media/gmp/gmp-api/gmp-audio-decode.h rename : content/media/gmp/gmp-api/gmp-audio-host.h => dom/media/gmp/gmp-api/gmp-audio-host.h rename : content/media/gmp/gmp-api/gmp-audio-samples.h => dom/media/gmp/gmp-api/gmp-audio-samples.h rename : content/media/gmp/gmp-api/gmp-decryption.h => dom/media/gmp/gmp-api/gmp-decryption.h rename : content/media/gmp/gmp-api/gmp-entrypoints.h => dom/media/gmp/gmp-api/gmp-entrypoints.h rename : content/media/gmp/gmp-api/gmp-errors.h => dom/media/gmp/gmp-api/gmp-errors.h rename : content/media/gmp/gmp-api/gmp-platform.h => dom/media/gmp/gmp-api/gmp-platform.h rename : content/media/gmp/gmp-api/gmp-storage.h => dom/media/gmp/gmp-api/gmp-storage.h rename : content/media/gmp/gmp-api/gmp-video-codec.h => dom/media/gmp/gmp-api/gmp-video-codec.h rename : content/media/gmp/gmp-api/gmp-video-decode.h => dom/media/gmp/gmp-api/gmp-video-decode.h rename : content/media/gmp/gmp-api/gmp-video-encode.h => dom/media/gmp/gmp-api/gmp-video-encode.h rename : content/media/gmp/gmp-api/gmp-video-frame-encoded.h => dom/media/gmp/gmp-api/gmp-video-frame-encoded.h rename : content/media/gmp/gmp-api/gmp-video-frame-i420.h => dom/media/gmp/gmp-api/gmp-video-frame-i420.h rename : content/media/gmp/gmp-api/gmp-video-frame.h => dom/media/gmp/gmp-api/gmp-video-frame.h rename : content/media/gmp/gmp-api/gmp-video-host.h => dom/media/gmp/gmp-api/gmp-video-host.h rename : content/media/gmp/gmp-api/gmp-video-plane.h => dom/media/gmp/gmp-api/gmp-video-plane.h rename : content/media/gmp/moz.build => dom/media/gmp/moz.build rename : content/media/gmp/mozIGeckoMediaPluginService.idl => dom/media/gmp/mozIGeckoMediaPluginService.idl rename : content/media/gmp/rlz/COPYING => dom/media/gmp/rlz/COPYING rename : content/media/gmp/rlz/README.mozilla => dom/media/gmp/rlz/README.mozilla rename : content/media/gmp/rlz/base/memory/scoped_ptr.h => dom/media/gmp/rlz/base/memory/scoped_ptr.h rename : content/media/gmp/rlz/base/string16.h => dom/media/gmp/rlz/base/string16.h rename : content/media/gmp/rlz/lib/assert.h => dom/media/gmp/rlz/lib/assert.h rename : content/media/gmp/rlz/lib/machine_id.h => dom/media/gmp/rlz/lib/machine_id.h rename : content/media/gmp/rlz/lib/string_utils.cc => dom/media/gmp/rlz/lib/string_utils.cc rename : content/media/gmp/rlz/lib/string_utils.h => dom/media/gmp/rlz/lib/string_utils.h rename : content/media/gmp/rlz/moz.build => dom/media/gmp/rlz/moz.build rename : content/media/gmp/rlz/win/lib/machine_id_win.cc => dom/media/gmp/rlz/win/lib/machine_id_win.cc rename : content/media/gstreamer/GStreamerAllocator.cpp => dom/media/gstreamer/GStreamerAllocator.cpp rename : content/media/gstreamer/GStreamerAllocator.h => dom/media/gstreamer/GStreamerAllocator.h rename : content/media/gstreamer/GStreamerDecoder.cpp => dom/media/gstreamer/GStreamerDecoder.cpp rename : content/media/gstreamer/GStreamerDecoder.h => dom/media/gstreamer/GStreamerDecoder.h rename : content/media/gstreamer/GStreamerFormatHelper.cpp => dom/media/gstreamer/GStreamerFormatHelper.cpp rename : content/media/gstreamer/GStreamerFormatHelper.h => dom/media/gstreamer/GStreamerFormatHelper.h rename : content/media/gstreamer/GStreamerFunctionList.h => dom/media/gstreamer/GStreamerFunctionList.h rename : content/media/gstreamer/GStreamerLoader.cpp => dom/media/gstreamer/GStreamerLoader.cpp rename : content/media/gstreamer/GStreamerLoader.h => dom/media/gstreamer/GStreamerLoader.h rename : content/media/gstreamer/GStreamerMozVideoBuffer.cpp => dom/media/gstreamer/GStreamerMozVideoBuffer.cpp rename : content/media/gstreamer/GStreamerMozVideoBuffer.h => dom/media/gstreamer/GStreamerMozVideoBuffer.h rename : content/media/gstreamer/GStreamerReader-0.10.cpp => dom/media/gstreamer/GStreamerReader-0.10.cpp rename : content/media/gstreamer/GStreamerReader.cpp => dom/media/gstreamer/GStreamerReader.cpp rename : content/media/gstreamer/GStreamerReader.h => dom/media/gstreamer/GStreamerReader.h rename : content/media/gstreamer/moz.build => dom/media/gstreamer/moz.build rename : content/media/gtest/MockMediaDecoderOwner.h => dom/media/gtest/MockMediaDecoderOwner.h rename : content/media/gtest/MockMediaResource.cpp => dom/media/gtest/MockMediaResource.cpp rename : content/media/gtest/MockMediaResource.h => dom/media/gtest/MockMediaResource.h rename : content/media/gtest/TestAudioCompactor.cpp => dom/media/gtest/TestAudioCompactor.cpp rename : content/media/gtest/TestGMPCrossOrigin.cpp => dom/media/gtest/TestGMPCrossOrigin.cpp rename : content/media/gtest/TestMP4Reader.cpp => dom/media/gtest/TestMP4Reader.cpp rename : content/media/gtest/TestTrackEncoder.cpp => dom/media/gtest/TestTrackEncoder.cpp rename : content/media/gtest/TestVideoSegment.cpp => dom/media/gtest/TestVideoSegment.cpp rename : content/media/gtest/TestVideoTrackEncoder.cpp => dom/media/gtest/TestVideoTrackEncoder.cpp rename : content/media/gtest/TestVorbisTrackEncoder.cpp => dom/media/gtest/TestVorbisTrackEncoder.cpp rename : content/media/gtest/TestWebMBuffered.cpp => dom/media/gtest/TestWebMBuffered.cpp rename : content/media/gtest/TestWebMWriter.cpp => dom/media/gtest/TestWebMWriter.cpp rename : content/media/gtest/mediasource_test.mp4 => dom/media/gtest/mediasource_test.mp4 rename : content/media/gtest/moz.build => dom/media/gtest/moz.build rename : content/media/gtest/test.webm => dom/media/gtest/test.webm rename : content/media/imagecapture/CaptureTask.cpp => dom/media/imagecapture/CaptureTask.cpp rename : content/media/imagecapture/CaptureTask.h => dom/media/imagecapture/CaptureTask.h rename : content/media/imagecapture/ImageCapture.cpp => dom/media/imagecapture/ImageCapture.cpp rename : content/media/imagecapture/ImageCapture.h => dom/media/imagecapture/ImageCapture.h rename : content/media/imagecapture/moz.build => dom/media/imagecapture/moz.build rename : content/media/mediasource/AsyncEventRunner.h => dom/media/mediasource/AsyncEventRunner.h rename : content/media/mediasource/ContainerParser.cpp => dom/media/mediasource/ContainerParser.cpp rename : content/media/mediasource/ContainerParser.h => dom/media/mediasource/ContainerParser.h rename : content/media/mediasource/MediaSource.cpp => dom/media/mediasource/MediaSource.cpp rename : content/media/mediasource/MediaSource.h => dom/media/mediasource/MediaSource.h rename : content/media/mediasource/MediaSourceDecoder.cpp => dom/media/mediasource/MediaSourceDecoder.cpp rename : content/media/mediasource/MediaSourceDecoder.h => dom/media/mediasource/MediaSourceDecoder.h rename : content/media/mediasource/MediaSourceReader.cpp => dom/media/mediasource/MediaSourceReader.cpp rename : content/media/mediasource/MediaSourceReader.h => dom/media/mediasource/MediaSourceReader.h rename : content/media/mediasource/MediaSourceResource.h => dom/media/mediasource/MediaSourceResource.h rename : content/media/mediasource/MediaSourceUtils.cpp => dom/media/mediasource/MediaSourceUtils.cpp rename : content/media/mediasource/MediaSourceUtils.h => dom/media/mediasource/MediaSourceUtils.h rename : content/media/mediasource/ResourceQueue.h => dom/media/mediasource/ResourceQueue.h rename : content/media/mediasource/SourceBuffer.cpp => dom/media/mediasource/SourceBuffer.cpp rename : content/media/mediasource/SourceBuffer.h => dom/media/mediasource/SourceBuffer.h rename : content/media/mediasource/SourceBufferDecoder.cpp => dom/media/mediasource/SourceBufferDecoder.cpp rename : content/media/mediasource/SourceBufferDecoder.h => dom/media/mediasource/SourceBufferDecoder.h rename : content/media/mediasource/SourceBufferList.cpp => dom/media/mediasource/SourceBufferList.cpp rename : content/media/mediasource/SourceBufferList.h => dom/media/mediasource/SourceBufferList.h rename : content/media/mediasource/SourceBufferResource.cpp => dom/media/mediasource/SourceBufferResource.cpp rename : content/media/mediasource/SourceBufferResource.h => dom/media/mediasource/SourceBufferResource.h rename : content/media/mediasource/TrackBuffer.cpp => dom/media/mediasource/TrackBuffer.cpp rename : content/media/mediasource/TrackBuffer.h => dom/media/mediasource/TrackBuffer.h rename : content/media/mediasource/moz.build => dom/media/mediasource/moz.build rename : content/media/mediasource/test/crashtests/1005366.html => dom/media/mediasource/test/crashtests/1005366.html rename : content/media/mediasource/test/crashtests/1059035.html => dom/media/mediasource/test/crashtests/1059035.html rename : content/media/mediasource/test/crashtests/926665.html => dom/media/mediasource/test/crashtests/926665.html rename : content/media/mediasource/test/crashtests/931388.html => dom/media/mediasource/test/crashtests/931388.html rename : content/media/mediasource/test/crashtests/crashtests.list => dom/media/mediasource/test/crashtests/crashtests.list rename : content/media/mediasource/test/mediasource.js => dom/media/mediasource/test/mediasource.js rename : content/media/mediasource/test/mochitest.ini => dom/media/mediasource/test/mochitest.ini rename : content/media/mediasource/test/seek.webm => dom/media/mediasource/test/seek.webm rename : content/media/mediasource/test/seek.webm^headers^ => dom/media/mediasource/test/seek.webm^headers^ rename : content/media/mediasource/test/seek_lowres.webm => dom/media/mediasource/test/seek_lowres.webm rename : content/media/mediasource/test/seek_lowres.webm^headers^ => dom/media/mediasource/test/seek_lowres.webm^headers^ rename : content/media/mediasource/test/test_BufferedSeek.html => dom/media/mediasource/test/test_BufferedSeek.html rename : content/media/mediasource/test/test_FrameSelection.html => dom/media/mediasource/test/test_FrameSelection.html rename : content/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html => dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html rename : content/media/mediasource/test/test_MediaSource.html => dom/media/mediasource/test/test_MediaSource.html rename : content/media/mediasource/test/test_MediaSource_disabled.html => dom/media/mediasource/test/test_MediaSource_disabled.html rename : content/media/mediasource/test/test_SeekableAfterEndOfStream.html => dom/media/mediasource/test/test_SeekableAfterEndOfStream.html rename : content/media/mediasource/test/test_SeekableAfterEndOfStreamSplit.html => dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit.html rename : content/media/mediasource/test/test_SeekableBeforeEndOfStream.html => dom/media/mediasource/test/test_SeekableBeforeEndOfStream.html rename : content/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html => dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html rename : content/media/mediasource/test/test_SplitAppend.html => dom/media/mediasource/test/test_SplitAppend.html rename : content/media/mediasource/test/test_SplitAppendDelay.html => dom/media/mediasource/test/test_SplitAppendDelay.html rename : content/media/nsIDocumentActivity.h => dom/media/nsIDocumentActivity.h rename : content/media/ogg/OggCodecState.cpp => dom/media/ogg/OggCodecState.cpp rename : content/media/ogg/OggCodecState.h => dom/media/ogg/OggCodecState.h rename : content/media/ogg/OggDecoder.cpp => dom/media/ogg/OggDecoder.cpp rename : content/media/ogg/OggDecoder.h => dom/media/ogg/OggDecoder.h rename : content/media/ogg/OggReader.cpp => dom/media/ogg/OggReader.cpp rename : content/media/ogg/OggReader.h => dom/media/ogg/OggReader.h rename : content/media/ogg/OggWriter.cpp => dom/media/ogg/OggWriter.cpp rename : content/media/ogg/OggWriter.h => dom/media/ogg/OggWriter.h rename : content/media/ogg/OpusParser.cpp => dom/media/ogg/OpusParser.cpp rename : content/media/ogg/OpusParser.h => dom/media/ogg/OpusParser.h rename : content/media/ogg/moz.build => dom/media/ogg/moz.build rename : content/media/omx/AudioOffloadPlayer.cpp => dom/media/omx/AudioOffloadPlayer.cpp rename : content/media/omx/AudioOffloadPlayer.h => dom/media/omx/AudioOffloadPlayer.h rename : content/media/omx/AudioOffloadPlayerBase.h => dom/media/omx/AudioOffloadPlayerBase.h rename : content/media/omx/AudioOutput.cpp => dom/media/omx/AudioOutput.cpp rename : content/media/omx/AudioOutput.h => dom/media/omx/AudioOutput.h rename : content/media/omx/AudioSink.h => dom/media/omx/AudioSink.h rename : content/media/omx/I420ColorConverterHelper.cpp => dom/media/omx/I420ColorConverterHelper.cpp rename : content/media/omx/I420ColorConverterHelper.h => dom/media/omx/I420ColorConverterHelper.h rename : content/media/omx/MPAPI.h => dom/media/omx/MPAPI.h rename : content/media/omx/MediaCodecDecoder.cpp => dom/media/omx/MediaCodecDecoder.cpp rename : content/media/omx/MediaCodecDecoder.h => dom/media/omx/MediaCodecDecoder.h rename : content/media/omx/MediaCodecProxy.cpp => dom/media/omx/MediaCodecProxy.cpp rename : content/media/omx/MediaCodecProxy.h => dom/media/omx/MediaCodecProxy.h rename : content/media/omx/MediaCodecReader.cpp => dom/media/omx/MediaCodecReader.cpp rename : content/media/omx/MediaCodecReader.h => dom/media/omx/MediaCodecReader.h rename : content/media/omx/MediaOmxCommonDecoder.cpp => dom/media/omx/MediaOmxCommonDecoder.cpp rename : content/media/omx/MediaOmxCommonDecoder.h => dom/media/omx/MediaOmxCommonDecoder.h rename : content/media/omx/MediaOmxCommonReader.cpp => dom/media/omx/MediaOmxCommonReader.cpp rename : content/media/omx/MediaOmxCommonReader.h => dom/media/omx/MediaOmxCommonReader.h rename : content/media/omx/MediaOmxDecoder.cpp => dom/media/omx/MediaOmxDecoder.cpp rename : content/media/omx/MediaOmxDecoder.h => dom/media/omx/MediaOmxDecoder.h rename : content/media/omx/MediaOmxReader.cpp => dom/media/omx/MediaOmxReader.cpp rename : content/media/omx/MediaOmxReader.h => dom/media/omx/MediaOmxReader.h rename : content/media/omx/MediaStreamSource.cpp => dom/media/omx/MediaStreamSource.cpp rename : content/media/omx/MediaStreamSource.h => dom/media/omx/MediaStreamSource.h rename : content/media/omx/OMXCodecDescriptorUtil.cpp => dom/media/omx/OMXCodecDescriptorUtil.cpp rename : content/media/omx/OMXCodecDescriptorUtil.h => dom/media/omx/OMXCodecDescriptorUtil.h rename : content/media/omx/OMXCodecProxy.cpp => dom/media/omx/OMXCodecProxy.cpp rename : content/media/omx/OMXCodecProxy.h => dom/media/omx/OMXCodecProxy.h rename : content/media/omx/OMXCodecWrapper.cpp => dom/media/omx/OMXCodecWrapper.cpp rename : content/media/omx/OMXCodecWrapper.h => dom/media/omx/OMXCodecWrapper.h rename : content/media/omx/OmxDecoder.cpp => dom/media/omx/OmxDecoder.cpp rename : content/media/omx/OmxDecoder.h => dom/media/omx/OmxDecoder.h rename : content/media/omx/RtspExtractor.cpp => dom/media/omx/RtspExtractor.cpp rename : content/media/omx/RtspExtractor.h => dom/media/omx/RtspExtractor.h rename : content/media/omx/RtspMediaCodecDecoder.cpp => dom/media/omx/RtspMediaCodecDecoder.cpp rename : content/media/omx/RtspMediaCodecDecoder.h => dom/media/omx/RtspMediaCodecDecoder.h rename : content/media/omx/RtspMediaCodecReader.cpp => dom/media/omx/RtspMediaCodecReader.cpp rename : content/media/omx/RtspMediaCodecReader.h => dom/media/omx/RtspMediaCodecReader.h rename : content/media/omx/RtspOmxDecoder.cpp => dom/media/omx/RtspOmxDecoder.cpp rename : content/media/omx/RtspOmxDecoder.h => dom/media/omx/RtspOmxDecoder.h rename : content/media/omx/RtspOmxReader.cpp => dom/media/omx/RtspOmxReader.cpp rename : content/media/omx/RtspOmxReader.h => dom/media/omx/RtspOmxReader.h rename : content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.cpp => dom/media/omx/mediaresourcemanager/IMediaResourceManagerClient.cpp rename : content/media/omx/mediaresourcemanager/IMediaResourceManagerClient.h => dom/media/omx/mediaresourcemanager/IMediaResourceManagerClient.h rename : content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.cpp => dom/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.cpp rename : content/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.h => dom/media/omx/mediaresourcemanager/IMediaResourceManagerDeathNotifier.h rename : content/media/omx/mediaresourcemanager/IMediaResourceManagerService.cpp => dom/media/omx/mediaresourcemanager/IMediaResourceManagerService.cpp rename : content/media/omx/mediaresourcemanager/IMediaResourceManagerService.h => dom/media/omx/mediaresourcemanager/IMediaResourceManagerService.h rename : content/media/omx/mediaresourcemanager/MediaResourceHandler.cpp => dom/media/omx/mediaresourcemanager/MediaResourceHandler.cpp rename : content/media/omx/mediaresourcemanager/MediaResourceHandler.h => dom/media/omx/mediaresourcemanager/MediaResourceHandler.h rename : content/media/omx/mediaresourcemanager/MediaResourceManagerClient.cpp => dom/media/omx/mediaresourcemanager/MediaResourceManagerClient.cpp rename : content/media/omx/mediaresourcemanager/MediaResourceManagerClient.h => dom/media/omx/mediaresourcemanager/MediaResourceManagerClient.h rename : content/media/omx/mediaresourcemanager/MediaResourceManagerService.cpp => dom/media/omx/mediaresourcemanager/MediaResourceManagerService.cpp rename : content/media/omx/mediaresourcemanager/MediaResourceManagerService.h => dom/media/omx/mediaresourcemanager/MediaResourceManagerService.h rename : content/media/omx/mediaresourcemanager/moz.build => dom/media/omx/mediaresourcemanager/moz.build rename : content/media/omx/moz.build => dom/media/omx/moz.build rename : content/media/raw/RawDecoder.cpp => dom/media/raw/RawDecoder.cpp rename : content/media/raw/RawDecoder.h => dom/media/raw/RawDecoder.h rename : content/media/raw/RawReader.cpp => dom/media/raw/RawReader.cpp rename : content/media/raw/RawReader.h => dom/media/raw/RawReader.h rename : content/media/raw/RawStructs.h => dom/media/raw/RawStructs.h rename : content/media/raw/moz.build => dom/media/raw/moz.build rename : content/media/systemservices/LoadManager.cpp => dom/media/systemservices/LoadManager.cpp rename : content/media/systemservices/LoadManager.h => dom/media/systemservices/LoadManager.h rename : content/media/systemservices/LoadManagerFactory.cpp => dom/media/systemservices/LoadManagerFactory.cpp rename : content/media/systemservices/LoadManagerFactory.h => dom/media/systemservices/LoadManagerFactory.h rename : content/media/systemservices/LoadMonitor.cpp => dom/media/systemservices/LoadMonitor.cpp rename : content/media/systemservices/LoadMonitor.h => dom/media/systemservices/LoadMonitor.h rename : content/media/systemservices/OSXRunLoopSingleton.cpp => dom/media/systemservices/OSXRunLoopSingleton.cpp rename : content/media/systemservices/OSXRunLoopSingleton.h => dom/media/systemservices/OSXRunLoopSingleton.h rename : content/media/systemservices/OpenSLESProvider.cpp => dom/media/systemservices/OpenSLESProvider.cpp rename : content/media/systemservices/OpenSLESProvider.h => dom/media/systemservices/OpenSLESProvider.h rename : content/media/systemservices/moz.build => dom/media/systemservices/moz.build rename : content/media/test/320x240.ogv => dom/media/test/320x240.ogv rename : content/media/test/320x240.ogv^headers^ => dom/media/test/320x240.ogv^headers^ rename : content/media/test/448636.ogv => dom/media/test/448636.ogv rename : content/media/test/448636.ogv^headers^ => dom/media/test/448636.ogv^headers^ rename : content/media/test/VID_0001.ogg => dom/media/test/VID_0001.ogg rename : content/media/test/VID_0001.ogg^headers^ => dom/media/test/VID_0001.ogg^headers^ rename : content/media/test/allowed.sjs => dom/media/test/allowed.sjs rename : content/media/test/audio-gaps.ogg => dom/media/test/audio-gaps.ogg rename : content/media/test/audio-gaps.ogg^headers^ => dom/media/test/audio-gaps.ogg^headers^ rename : content/media/test/audio-overhang.ogg => dom/media/test/audio-overhang.ogg rename : content/media/test/audio-overhang.ogg^headers^ => dom/media/test/audio-overhang.ogg^headers^ rename : content/media/test/audio.wav => dom/media/test/audio.wav rename : content/media/test/audio.wav^headers^ => dom/media/test/audio.wav^headers^ rename : content/media/test/bad-signature.vtt => dom/media/test/bad-signature.vtt rename : content/media/test/badtags.ogg => dom/media/test/badtags.ogg rename : content/media/test/badtags.ogg^headers^ => dom/media/test/badtags.ogg^headers^ rename : content/media/test/basic.vtt => dom/media/test/basic.vtt rename : content/media/test/beta-phrasebook.ogg => dom/media/test/beta-phrasebook.ogg rename : content/media/test/beta-phrasebook.ogg^headers^ => dom/media/test/beta-phrasebook.ogg^headers^ rename : content/media/test/big.wav => dom/media/test/big.wav rename : content/media/test/big.wav^headers^ => dom/media/test/big.wav^headers^ rename : content/media/test/bogus.duh => dom/media/test/bogus.duh rename : content/media/test/bogus.ogv => dom/media/test/bogus.ogv rename : content/media/test/bogus.ogv^headers^ => dom/media/test/bogus.ogv^headers^ rename : content/media/test/bogus.wav => dom/media/test/bogus.wav rename : content/media/test/bogus.wav^headers^ => dom/media/test/bogus.wav^headers^ rename : content/media/test/bug1066943.webm => dom/media/test/bug1066943.webm rename : content/media/test/bug1066943.webm^headers^ => dom/media/test/bug1066943.webm^headers^ rename : content/media/test/bug461281.ogg => dom/media/test/bug461281.ogg rename : content/media/test/bug461281.ogg^headers^ => dom/media/test/bug461281.ogg^headers^ rename : content/media/test/bug482461-theora.ogv => dom/media/test/bug482461-theora.ogv rename : content/media/test/bug482461-theora.ogv^headers^ => dom/media/test/bug482461-theora.ogv^headers^ rename : content/media/test/bug482461.ogv => dom/media/test/bug482461.ogv rename : content/media/test/bug482461.ogv^headers^ => dom/media/test/bug482461.ogv^headers^ rename : content/media/test/bug495129.ogv => dom/media/test/bug495129.ogv rename : content/media/test/bug495129.ogv^headers^ => dom/media/test/bug495129.ogv^headers^ rename : content/media/test/bug495794.ogg => dom/media/test/bug495794.ogg rename : content/media/test/bug495794.ogg^headers^ => dom/media/test/bug495794.ogg^headers^ rename : content/media/test/bug498380.ogv => dom/media/test/bug498380.ogv rename : content/media/test/bug498380.ogv^headers^ => dom/media/test/bug498380.ogv^headers^ rename : content/media/test/bug498855-1.ogv => dom/media/test/bug498855-1.ogv rename : content/media/test/bug498855-1.ogv^headers^ => dom/media/test/bug498855-1.ogv^headers^ rename : content/media/test/bug498855-2.ogv => dom/media/test/bug498855-2.ogv rename : content/media/test/bug498855-2.ogv^headers^ => dom/media/test/bug498855-2.ogv^headers^ rename : content/media/test/bug498855-3.ogv => dom/media/test/bug498855-3.ogv rename : content/media/test/bug498855-3.ogv^headers^ => dom/media/test/bug498855-3.ogv^headers^ rename : content/media/test/bug499519.ogv => dom/media/test/bug499519.ogv rename : content/media/test/bug499519.ogv^headers^ => dom/media/test/bug499519.ogv^headers^ rename : content/media/test/bug500311.ogv => dom/media/test/bug500311.ogv rename : content/media/test/bug500311.ogv^headers^ => dom/media/test/bug500311.ogv^headers^ rename : content/media/test/bug501279.ogg => dom/media/test/bug501279.ogg rename : content/media/test/bug501279.ogg^headers^ => dom/media/test/bug501279.ogg^headers^ rename : content/media/test/bug504613.ogv => dom/media/test/bug504613.ogv rename : content/media/test/bug504613.ogv^headers^ => dom/media/test/bug504613.ogv^headers^ rename : content/media/test/bug504644.ogv => dom/media/test/bug504644.ogv rename : content/media/test/bug504644.ogv^headers^ => dom/media/test/bug504644.ogv^headers^ rename : content/media/test/bug504843.ogv => dom/media/test/bug504843.ogv rename : content/media/test/bug504843.ogv^headers^ => dom/media/test/bug504843.ogv^headers^ rename : content/media/test/bug506094.ogv => dom/media/test/bug506094.ogv rename : content/media/test/bug506094.ogv^headers^ => dom/media/test/bug506094.ogv^headers^ rename : content/media/test/bug516323.indexed.ogv => dom/media/test/bug516323.indexed.ogv rename : content/media/test/bug516323.indexed.ogv^headers^ => dom/media/test/bug516323.indexed.ogv^headers^ rename : content/media/test/bug516323.ogv => dom/media/test/bug516323.ogv rename : content/media/test/bug516323.ogv^headers^ => dom/media/test/bug516323.ogv^headers^ rename : content/media/test/bug520493.ogg => dom/media/test/bug520493.ogg rename : content/media/test/bug520493.ogg^headers^ => dom/media/test/bug520493.ogg^headers^ rename : content/media/test/bug520500.ogg => dom/media/test/bug520500.ogg rename : content/media/test/bug520500.ogg^headers^ => dom/media/test/bug520500.ogg^headers^ rename : content/media/test/bug520908.ogv => dom/media/test/bug520908.ogv rename : content/media/test/bug520908.ogv^headers^ => dom/media/test/bug520908.ogv^headers^ rename : content/media/test/bug523816.ogv => dom/media/test/bug523816.ogv rename : content/media/test/bug523816.ogv^headers^ => dom/media/test/bug523816.ogv^headers^ rename : content/media/test/bug533822.ogg => dom/media/test/bug533822.ogg rename : content/media/test/bug533822.ogg^headers^ => dom/media/test/bug533822.ogg^headers^ rename : content/media/test/bug556821.ogv => dom/media/test/bug556821.ogv rename : content/media/test/bug556821.ogv^headers^ => dom/media/test/bug556821.ogv^headers^ rename : content/media/test/bug557094.ogv => dom/media/test/bug557094.ogv rename : content/media/test/bug557094.ogv^headers^ => dom/media/test/bug557094.ogv^headers^ rename : content/media/test/bug580982.webm => dom/media/test/bug580982.webm rename : content/media/test/bug580982.webm^headers^ => dom/media/test/bug580982.webm^headers^ rename : content/media/test/bug603918.webm => dom/media/test/bug603918.webm rename : content/media/test/bug603918.webm^headers^ => dom/media/test/bug603918.webm^headers^ rename : content/media/test/bug604067.webm => dom/media/test/bug604067.webm rename : content/media/test/bug604067.webm^headers^ => dom/media/test/bug604067.webm^headers^ rename : content/media/test/bug883173.vtt => dom/media/test/bug883173.vtt rename : content/media/test/can_play_type_dash.js => dom/media/test/can_play_type_dash.js rename : content/media/test/can_play_type_ogg.js => dom/media/test/can_play_type_ogg.js rename : content/media/test/can_play_type_wave.js => dom/media/test/can_play_type_wave.js rename : content/media/test/can_play_type_webm.js => dom/media/test/can_play_type_webm.js rename : content/media/test/cancellable_request.sjs => dom/media/test/cancellable_request.sjs rename : content/media/test/chain.ogg => dom/media/test/chain.ogg rename : content/media/test/chain.ogg^headers^ => dom/media/test/chain.ogg^headers^ rename : content/media/test/chain.ogv => dom/media/test/chain.ogv rename : content/media/test/chain.ogv^headers^ => dom/media/test/chain.ogv^headers^ rename : content/media/test/chain.opus => dom/media/test/chain.opus rename : content/media/test/chain.opus^headers^ => dom/media/test/chain.opus^headers^ rename : content/media/test/chained-audio-video.ogg => dom/media/test/chained-audio-video.ogg rename : content/media/test/chained-audio-video.ogg^headers^ => dom/media/test/chained-audio-video.ogg^headers^ rename : content/media/test/chained-video.ogv => dom/media/test/chained-video.ogv rename : content/media/test/chained-video.ogv^headers^ => dom/media/test/chained-video.ogv^headers^ rename : content/media/test/chrome.ini => dom/media/test/chrome.ini rename : content/media/test/contentDuration1.sjs => dom/media/test/contentDuration1.sjs rename : content/media/test/contentDuration2.sjs => dom/media/test/contentDuration2.sjs rename : content/media/test/contentDuration3.sjs => dom/media/test/contentDuration3.sjs rename : content/media/test/contentDuration4.sjs => dom/media/test/contentDuration4.sjs rename : content/media/test/contentDuration5.sjs => dom/media/test/contentDuration5.sjs rename : content/media/test/contentDuration6.sjs => dom/media/test/contentDuration6.sjs rename : content/media/test/contentDuration7.sjs => dom/media/test/contentDuration7.sjs rename : content/media/test/contentType.sjs => dom/media/test/contentType.sjs rename : content/media/test/crashtests/0-timescale.html => dom/media/test/crashtests/0-timescale.html rename : content/media/test/crashtests/0-timescale.mp4 => dom/media/test/crashtests/0-timescale.mp4 rename : content/media/test/crashtests/1015662.html => dom/media/test/crashtests/1015662.html rename : content/media/test/crashtests/1028458.html => dom/media/test/crashtests/1028458.html rename : content/media/test/crashtests/1080986.html => dom/media/test/crashtests/1080986.html rename : content/media/test/crashtests/1080986.wav => dom/media/test/crashtests/1080986.wav rename : content/media/test/crashtests/459439-1.html => dom/media/test/crashtests/459439-1.html rename : content/media/test/crashtests/466607-1.html => dom/media/test/crashtests/466607-1.html rename : content/media/test/crashtests/466945-1.html => dom/media/test/crashtests/466945-1.html rename : content/media/test/crashtests/468763-1.html => dom/media/test/crashtests/468763-1.html rename : content/media/test/crashtests/474744-1.html => dom/media/test/crashtests/474744-1.html rename : content/media/test/crashtests/481136-1.html => dom/media/test/crashtests/481136-1.html rename : content/media/test/crashtests/492286-1.xhtml => dom/media/test/crashtests/492286-1.xhtml rename : content/media/test/crashtests/493915-1.html => dom/media/test/crashtests/493915-1.html rename : content/media/test/crashtests/495794-1.html => dom/media/test/crashtests/495794-1.html rename : content/media/test/crashtests/495794-1.ogg => dom/media/test/crashtests/495794-1.ogg rename : content/media/test/crashtests/576612-1.html => dom/media/test/crashtests/576612-1.html rename : content/media/test/crashtests/691096-1.html => dom/media/test/crashtests/691096-1.html rename : content/media/test/crashtests/752784-1.html => dom/media/test/crashtests/752784-1.html rename : content/media/test/crashtests/789075-1.html => dom/media/test/crashtests/789075-1.html rename : content/media/test/crashtests/789075.webm => dom/media/test/crashtests/789075.webm rename : content/media/test/crashtests/795892-1.html => dom/media/test/crashtests/795892-1.html rename : content/media/test/crashtests/844563.html => dom/media/test/crashtests/844563.html rename : content/media/test/crashtests/846612.html => dom/media/test/crashtests/846612.html rename : content/media/test/crashtests/852838.html => dom/media/test/crashtests/852838.html rename : content/media/test/crashtests/865537-1.html => dom/media/test/crashtests/865537-1.html rename : content/media/test/crashtests/868504.html => dom/media/test/crashtests/868504.html rename : content/media/test/crashtests/874869.html => dom/media/test/crashtests/874869.html rename : content/media/test/crashtests/874915.html => dom/media/test/crashtests/874915.html rename : content/media/test/crashtests/874934.html => dom/media/test/crashtests/874934.html rename : content/media/test/crashtests/874952.html => dom/media/test/crashtests/874952.html rename : content/media/test/crashtests/875144.html => dom/media/test/crashtests/875144.html rename : content/media/test/crashtests/875596.html => dom/media/test/crashtests/875596.html rename : content/media/test/crashtests/875911.html => dom/media/test/crashtests/875911.html rename : content/media/test/crashtests/876024-1.html => dom/media/test/crashtests/876024-1.html rename : content/media/test/crashtests/876024-2.html => dom/media/test/crashtests/876024-2.html rename : content/media/test/crashtests/876118.html => dom/media/test/crashtests/876118.html rename : content/media/test/crashtests/876207.html => dom/media/test/crashtests/876207.html rename : content/media/test/crashtests/876215.html => dom/media/test/crashtests/876215.html rename : content/media/test/crashtests/876249.html => dom/media/test/crashtests/876249.html rename : content/media/test/crashtests/876252.html => dom/media/test/crashtests/876252.html rename : content/media/test/crashtests/876834.html => dom/media/test/crashtests/876834.html rename : content/media/test/crashtests/877527.html => dom/media/test/crashtests/877527.html rename : content/media/test/crashtests/877820.html => dom/media/test/crashtests/877820.html rename : content/media/test/crashtests/878014.html => dom/media/test/crashtests/878014.html rename : content/media/test/crashtests/878328.html => dom/media/test/crashtests/878328.html rename : content/media/test/crashtests/878407.html => dom/media/test/crashtests/878407.html rename : content/media/test/crashtests/878478.html => dom/media/test/crashtests/878478.html rename : content/media/test/crashtests/880129.html => dom/media/test/crashtests/880129.html rename : content/media/test/crashtests/880202.html => dom/media/test/crashtests/880202.html rename : content/media/test/crashtests/880342-1.html => dom/media/test/crashtests/880342-1.html rename : content/media/test/crashtests/880342-2.html => dom/media/test/crashtests/880342-2.html rename : content/media/test/crashtests/880384.html => dom/media/test/crashtests/880384.html rename : content/media/test/crashtests/880404.html => dom/media/test/crashtests/880404.html rename : content/media/test/crashtests/880724.html => dom/media/test/crashtests/880724.html rename : content/media/test/crashtests/881775.html => dom/media/test/crashtests/881775.html rename : content/media/test/crashtests/882549.html => dom/media/test/crashtests/882549.html rename : content/media/test/crashtests/882956.html => dom/media/test/crashtests/882956.html rename : content/media/test/crashtests/884459.html => dom/media/test/crashtests/884459.html rename : content/media/test/crashtests/889042.html => dom/media/test/crashtests/889042.html rename : content/media/test/crashtests/894104.html => dom/media/test/crashtests/894104.html rename : content/media/test/crashtests/907986-1.html => dom/media/test/crashtests/907986-1.html rename : content/media/test/crashtests/907986-2.html => dom/media/test/crashtests/907986-2.html rename : content/media/test/crashtests/907986-3.html => dom/media/test/crashtests/907986-3.html rename : content/media/test/crashtests/907986-4.html => dom/media/test/crashtests/907986-4.html rename : content/media/test/crashtests/910171-1.html => dom/media/test/crashtests/910171-1.html rename : content/media/test/crashtests/920987.html => dom/media/test/crashtests/920987.html rename : content/media/test/crashtests/925619-1.html => dom/media/test/crashtests/925619-1.html rename : content/media/test/crashtests/925619-2.html => dom/media/test/crashtests/925619-2.html rename : content/media/test/crashtests/926619.html => dom/media/test/crashtests/926619.html rename : content/media/test/crashtests/933151.html => dom/media/test/crashtests/933151.html rename : content/media/test/crashtests/933156.html => dom/media/test/crashtests/933156.html rename : content/media/test/crashtests/944851.html => dom/media/test/crashtests/944851.html rename : content/media/test/crashtests/952756.html => dom/media/test/crashtests/952756.html rename : content/media/test/crashtests/966636.html => dom/media/test/crashtests/966636.html rename : content/media/test/crashtests/986901.html => dom/media/test/crashtests/986901.html rename : content/media/test/crashtests/990794.html => dom/media/test/crashtests/990794.html rename : content/media/test/crashtests/buffer-source-ended-1.html => dom/media/test/crashtests/buffer-source-ended-1.html rename : content/media/test/crashtests/cors.webm => dom/media/test/crashtests/cors.webm rename : content/media/test/crashtests/cors.webm^headers^ => dom/media/test/crashtests/cors.webm^headers^ rename : content/media/test/crashtests/crashtests.list => dom/media/test/crashtests/crashtests.list rename : content/media/test/crashtests/media-element-source-seek-1.html => dom/media/test/crashtests/media-element-source-seek-1.html rename : content/media/test/crashtests/offline-buffer-source-ended-1.html => dom/media/test/crashtests/offline-buffer-source-ended-1.html rename : content/media/test/crashtests/oscillator-ended-1.html => dom/media/test/crashtests/oscillator-ended-1.html rename : content/media/test/crashtests/oscillator-ended-2.html => dom/media/test/crashtests/oscillator-ended-2.html rename : content/media/test/crashtests/sound.ogg => dom/media/test/crashtests/sound.ogg rename : content/media/test/dash/dash-manifest-garbled-webm.mpd => dom/media/test/dash/dash-manifest-garbled-webm.mpd rename : content/media/test/dash/dash-manifest-garbled.mpd => dom/media/test/dash/dash-manifest-garbled.mpd rename : content/media/test/dash/dash-manifest-sjs.mpd => dom/media/test/dash/dash-manifest-sjs.mpd rename : content/media/test/dash/dash-manifest.mpd => dom/media/test/dash/dash-manifest.mpd rename : content/media/test/dash/dash-webm-audio-128k.webm => dom/media/test/dash/dash-webm-audio-128k.webm rename : content/media/test/dash/dash-webm-video-320x180.webm => dom/media/test/dash/dash-webm-video-320x180.webm rename : content/media/test/dash/dash-webm-video-428x240.webm => dom/media/test/dash/dash-webm-video-428x240.webm rename : content/media/test/dash/garbled.webm => dom/media/test/dash/garbled.webm rename : content/media/test/dash_detect_stream_switch.sjs => dom/media/test/dash_detect_stream_switch.sjs rename : content/media/test/detodos.opus => dom/media/test/detodos.opus rename : content/media/test/detodos.opus^headers^ => dom/media/test/detodos.opus^headers^ rename : content/media/test/detodos.webm => dom/media/test/detodos.webm rename : content/media/test/detodos.webm^headers^ => dom/media/test/detodos.webm^headers^ rename : content/media/test/dirac.ogg => dom/media/test/dirac.ogg rename : content/media/test/dirac.ogg^headers^ => dom/media/test/dirac.ogg^headers^ rename : content/media/test/dynamic_redirect.sjs => dom/media/test/dynamic_redirect.sjs rename : content/media/test/dynamic_resource.sjs => dom/media/test/dynamic_resource.sjs rename : content/media/test/file_access_controls.html => dom/media/test/file_access_controls.html rename : content/media/test/fragment_noplay.js => dom/media/test/fragment_noplay.js rename : content/media/test/fragment_play.js => dom/media/test/fragment_play.js rename : content/media/test/gizmo-frag-cenc.xml => dom/media/test/gizmo-frag-cenc.xml rename : content/media/test/gizmo-frag-cenc1.m4s => dom/media/test/gizmo-frag-cenc1.m4s rename : content/media/test/gizmo-frag-cenc2.m4s => dom/media/test/gizmo-frag-cenc2.m4s rename : content/media/test/gizmo-frag-cencinit.mp4 => dom/media/test/gizmo-frag-cencinit.mp4 rename : content/media/test/gizmo.mp4 => dom/media/test/gizmo.mp4 rename : content/media/test/gizmo.mp4^headers^ => dom/media/test/gizmo.mp4^headers^ rename : content/media/test/graph_latency.py => dom/media/test/graph_latency.py rename : content/media/test/huge-id3.mp3 => dom/media/test/huge-id3.mp3 rename : content/media/test/huge-id3.mp3^headers^ => dom/media/test/huge-id3.mp3^headers^ rename : content/media/test/id3tags.mp3 => dom/media/test/id3tags.mp3 rename : content/media/test/id3tags.mp3^headers^ => dom/media/test/id3tags.mp3^headers^ rename : content/media/test/invalid-cmap-s0c0.opus => dom/media/test/invalid-cmap-s0c0.opus rename : content/media/test/invalid-cmap-s0c0.opus^headers^ => dom/media/test/invalid-cmap-s0c0.opus^headers^ rename : content/media/test/invalid-cmap-s0c2.opus => dom/media/test/invalid-cmap-s0c2.opus rename : content/media/test/invalid-cmap-s0c2.opus^headers^ => dom/media/test/invalid-cmap-s0c2.opus^headers^ rename : content/media/test/invalid-cmap-s1c2.opus => dom/media/test/invalid-cmap-s1c2.opus rename : content/media/test/invalid-cmap-s1c2.opus^headers^ => dom/media/test/invalid-cmap-s1c2.opus^headers^ rename : content/media/test/invalid-cmap-short.opus => dom/media/test/invalid-cmap-short.opus rename : content/media/test/invalid-cmap-short.opus^headers^ => dom/media/test/invalid-cmap-short.opus^headers^ rename : content/media/test/invalid-discard_on_multi_blocks.webm => dom/media/test/invalid-discard_on_multi_blocks.webm rename : content/media/test/invalid-discard_on_multi_blocks.webm^headers^ => dom/media/test/invalid-discard_on_multi_blocks.webm^headers^ rename : content/media/test/invalid-excess_discard.webm => dom/media/test/invalid-excess_discard.webm rename : content/media/test/invalid-excess_discard.webm^headers^ => dom/media/test/invalid-excess_discard.webm^headers^ rename : content/media/test/invalid-excess_neg_discard.webm => dom/media/test/invalid-excess_neg_discard.webm rename : content/media/test/invalid-excess_neg_discard.webm^headers^ => dom/media/test/invalid-excess_neg_discard.webm^headers^ rename : content/media/test/invalid-m0c0.opus => dom/media/test/invalid-m0c0.opus rename : content/media/test/invalid-m0c0.opus^headers^ => dom/media/test/invalid-m0c0.opus^headers^ rename : content/media/test/invalid-m0c3.opus => dom/media/test/invalid-m0c3.opus rename : content/media/test/invalid-m0c3.opus^headers^ => dom/media/test/invalid-m0c3.opus^headers^ rename : content/media/test/invalid-m1c0.opus => dom/media/test/invalid-m1c0.opus rename : content/media/test/invalid-m1c0.opus^headers^ => dom/media/test/invalid-m1c0.opus^headers^ rename : content/media/test/invalid-m1c9.opus => dom/media/test/invalid-m1c9.opus rename : content/media/test/invalid-m1c9.opus^headers^ => dom/media/test/invalid-m1c9.opus^headers^ rename : content/media/test/invalid-m2c0.opus => dom/media/test/invalid-m2c0.opus rename : content/media/test/invalid-m2c0.opus^headers^ => dom/media/test/invalid-m2c0.opus^headers^ rename : content/media/test/invalid-m2c1.opus => dom/media/test/invalid-m2c1.opus rename : content/media/test/invalid-m2c1.opus^headers^ => dom/media/test/invalid-m2c1.opus^headers^ rename : content/media/test/invalid-neg_discard.webm => dom/media/test/invalid-neg_discard.webm rename : content/media/test/invalid-neg_discard.webm^headers^ => dom/media/test/invalid-neg_discard.webm^headers^ rename : content/media/test/invalid-preskip.webm => dom/media/test/invalid-preskip.webm rename : content/media/test/invalid-preskip.webm^headers^ => dom/media/test/invalid-preskip.webm^headers^ rename : content/media/test/long.vtt => dom/media/test/long.vtt rename : content/media/test/make-headers.sh => dom/media/test/make-headers.sh rename : content/media/test/manifest.js => dom/media/test/manifest.js rename : content/media/test/mochitest.ini => dom/media/test/mochitest.ini rename : content/media/test/multiple-bos-more-header-fileds.ogg => dom/media/test/multiple-bos-more-header-fileds.ogg rename : content/media/test/multiple-bos-more-header-fileds.ogg^headers^ => dom/media/test/multiple-bos-more-header-fileds.ogg^headers^ rename : content/media/test/multiple-bos.ogg => dom/media/test/multiple-bos.ogg rename : content/media/test/multiple-bos.ogg^headers^ => dom/media/test/multiple-bos.ogg^headers^ rename : content/media/test/no-cues.webm => dom/media/test/no-cues.webm rename : content/media/test/no-cues.webm^headers^ => dom/media/test/no-cues.webm^headers^ rename : content/media/test/noContentLength.sjs => dom/media/test/noContentLength.sjs rename : content/media/test/notags.mp3 => dom/media/test/notags.mp3 rename : content/media/test/notags.mp3^headers^ => dom/media/test/notags.mp3^headers^ rename : content/media/test/owl-funnier-id3.mp3 => dom/media/test/owl-funnier-id3.mp3 rename : content/media/test/owl-funnier-id3.mp3^headers^ => dom/media/test/owl-funnier-id3.mp3^headers^ rename : content/media/test/owl-funny-id3.mp3 => dom/media/test/owl-funny-id3.mp3 rename : content/media/test/owl-funny-id3.mp3^headers^ => dom/media/test/owl-funny-id3.mp3^headers^ rename : content/media/test/owl.mp3 => dom/media/test/owl.mp3 rename : content/media/test/owl.mp3^headers^ => dom/media/test/owl.mp3^headers^ rename : content/media/test/parser.vtt => dom/media/test/parser.vtt rename : content/media/test/pixel_aspect_ratio.mp4 => dom/media/test/pixel_aspect_ratio.mp4 rename : content/media/test/r11025_msadpcm_c1.wav => dom/media/test/r11025_msadpcm_c1.wav rename : content/media/test/r11025_msadpcm_c1.wav^headers^ => dom/media/test/r11025_msadpcm_c1.wav^headers^ rename : content/media/test/r11025_s16_c1.wav => dom/media/test/r11025_s16_c1.wav rename : content/media/test/r11025_s16_c1.wav^headers^ => dom/media/test/r11025_s16_c1.wav^headers^ rename : content/media/test/r11025_s16_c1_trailing.wav => dom/media/test/r11025_s16_c1_trailing.wav rename : content/media/test/r11025_s16_c1_trailing.wav^headers^ => dom/media/test/r11025_s16_c1_trailing.wav^headers^ rename : content/media/test/r11025_u8_c1.wav => dom/media/test/r11025_u8_c1.wav rename : content/media/test/r11025_u8_c1.wav^headers^ => dom/media/test/r11025_u8_c1.wav^headers^ rename : content/media/test/r11025_u8_c1_trunc.wav => dom/media/test/r11025_u8_c1_trunc.wav rename : content/media/test/r11025_u8_c1_trunc.wav^headers^ => dom/media/test/r11025_u8_c1_trunc.wav^headers^ rename : content/media/test/r16000_u8_c1_list.wav => dom/media/test/r16000_u8_c1_list.wav rename : content/media/test/r16000_u8_c1_list.wav^headers^ => dom/media/test/r16000_u8_c1_list.wav^headers^ rename : content/media/test/reactivate_helper.html => dom/media/test/reactivate_helper.html rename : content/media/test/redirect.sjs => dom/media/test/redirect.sjs rename : content/media/test/referer.sjs => dom/media/test/referer.sjs rename : content/media/test/region.vtt => dom/media/test/region.vtt rename : content/media/test/sample-fisbone-skeleton4.ogv => dom/media/test/sample-fisbone-skeleton4.ogv rename : content/media/test/sample-fisbone-skeleton4.ogv^headers^ => dom/media/test/sample-fisbone-skeleton4.ogv^headers^ rename : content/media/test/sample-fisbone-wrong-header.ogv => dom/media/test/sample-fisbone-wrong-header.ogv rename : content/media/test/sample-fisbone-wrong-header.ogv^headers^ => dom/media/test/sample-fisbone-wrong-header.ogv^headers^ rename : content/media/test/sample.3g2 => dom/media/test/sample.3g2 rename : content/media/test/sample.3gp => dom/media/test/sample.3gp rename : content/media/test/seek.ogv => dom/media/test/seek.ogv rename : content/media/test/seek.ogv^headers^ => dom/media/test/seek.ogv^headers^ rename : content/media/test/seek.webm => dom/media/test/seek.webm rename : content/media/test/seek.webm^headers^ => dom/media/test/seek.webm^headers^ rename : content/media/test/seek.yuv => dom/media/test/seek.yuv rename : content/media/test/seekLies.sjs => dom/media/test/seekLies.sjs rename : content/media/test/seek_support.js => dom/media/test/seek_support.js rename : content/media/test/seek_with_sound.ogg => dom/media/test/seek_with_sound.ogg rename : content/media/test/seek_with_sound.ogg^headers^ => dom/media/test/seek_with_sound.ogg^headers^ rename : content/media/test/short-cenc.mp4 => dom/media/test/short-cenc.mp4 rename : content/media/test/short-cenc.xml => dom/media/test/short-cenc.xml rename : content/media/test/short-video.ogv => dom/media/test/short-video.ogv rename : content/media/test/short-video.ogv^headers^ => dom/media/test/short-video.ogv^headers^ rename : content/media/test/short.mp4 => dom/media/test/short.mp4 rename : content/media/test/small-shot-mp3.mp4 => dom/media/test/small-shot-mp3.mp4 rename : content/media/test/small-shot-mp3.mp4^headers^ => dom/media/test/small-shot-mp3.mp4^headers^ rename : content/media/test/small-shot.m4a => dom/media/test/small-shot.m4a rename : content/media/test/small-shot.mp3 => dom/media/test/small-shot.mp3 rename : content/media/test/small-shot.mp3^headers^ => dom/media/test/small-shot.mp3^headers^ rename : content/media/test/small-shot.ogg => dom/media/test/small-shot.ogg rename : content/media/test/small-shot.ogg^headers^ => dom/media/test/small-shot.ogg^headers^ rename : content/media/test/sound.ogg => dom/media/test/sound.ogg rename : content/media/test/sound.ogg^headers^ => dom/media/test/sound.ogg^headers^ rename : content/media/test/spacestorm-1000Hz-100ms.ogg => dom/media/test/spacestorm-1000Hz-100ms.ogg rename : content/media/test/spacestorm-1000Hz-100ms.ogg^headers^ => dom/media/test/spacestorm-1000Hz-100ms.ogg^headers^ rename : content/media/test/split.webm => dom/media/test/split.webm rename : content/media/test/split.webm^headers^ => dom/media/test/split.webm^headers^ rename : content/media/test/street.mp4 => dom/media/test/street.mp4 rename : content/media/test/street.mp4^headers^ => dom/media/test/street.mp4^headers^ rename : content/media/test/test-1-mono.opus => dom/media/test/test-1-mono.opus rename : content/media/test/test-1-mono.opus^headers^ => dom/media/test/test-1-mono.opus^headers^ rename : content/media/test/test-2-stereo.opus => dom/media/test/test-2-stereo.opus rename : content/media/test/test-2-stereo.opus^headers^ => dom/media/test/test-2-stereo.opus^headers^ rename : content/media/test/test-3-LCR.opus => dom/media/test/test-3-LCR.opus rename : content/media/test/test-3-LCR.opus^headers^ => dom/media/test/test-3-LCR.opus^headers^ rename : content/media/test/test-4-quad.opus => dom/media/test/test-4-quad.opus rename : content/media/test/test-4-quad.opus^headers^ => dom/media/test/test-4-quad.opus^headers^ rename : content/media/test/test-5-5.0.opus => dom/media/test/test-5-5.0.opus rename : content/media/test/test-5-5.0.opus^headers^ => dom/media/test/test-5-5.0.opus^headers^ rename : content/media/test/test-6-5.1.opus => dom/media/test/test-6-5.1.opus rename : content/media/test/test-6-5.1.opus^headers^ => dom/media/test/test-6-5.1.opus^headers^ rename : content/media/test/test-7-6.1.opus => dom/media/test/test-7-6.1.opus rename : content/media/test/test-7-6.1.opus^headers^ => dom/media/test/test-7-6.1.opus^headers^ rename : content/media/test/test-8-7.1.opus => dom/media/test/test-8-7.1.opus rename : content/media/test/test-8-7.1.opus^headers^ => dom/media/test/test-8-7.1.opus^headers^ rename : content/media/test/test_VideoPlaybackQuality.html => dom/media/test/test_VideoPlaybackQuality.html rename : content/media/test/test_VideoPlaybackQuality_disabled.html => dom/media/test/test_VideoPlaybackQuality_disabled.html rename : content/media/test/test_access_control.html => dom/media/test/test_access_control.html rename : content/media/test/test_aspectratio_mp4.html => dom/media/test/test_aspectratio_mp4.html rename : content/media/test/test_audio1.html => dom/media/test/test_audio1.html rename : content/media/test/test_audio2.html => dom/media/test/test_audio2.html rename : content/media/test/test_audioDocumentTitle.html => dom/media/test/test_audioDocumentTitle.html rename : content/media/test/test_autoplay.html => dom/media/test/test_autoplay.html rename : content/media/test/test_autoplay_contentEditable.html => dom/media/test/test_autoplay_contentEditable.html rename : content/media/test/test_buffered.html => dom/media/test/test_buffered.html rename : content/media/test/test_bug1018933.html => dom/media/test/test_bug1018933.html rename : content/media/test/test_bug448534.html => dom/media/test/test_bug448534.html rename : content/media/test/test_bug463162.xhtml => dom/media/test/test_bug463162.xhtml rename : content/media/test/test_bug465498.html => dom/media/test/test_bug465498.html rename : content/media/test/test_bug493187.html => dom/media/test/test_bug493187.html rename : content/media/test/test_bug495145.html => dom/media/test/test_bug495145.html rename : content/media/test/test_bug495300.html => dom/media/test/test_bug495300.html rename : content/media/test/test_bug654550.html => dom/media/test/test_bug654550.html rename : content/media/test/test_bug686942.html => dom/media/test/test_bug686942.html rename : content/media/test/test_bug726904.html => dom/media/test/test_bug726904.html rename : content/media/test/test_bug874897.html => dom/media/test/test_bug874897.html rename : content/media/test/test_bug883173.html => dom/media/test/test_bug883173.html rename : content/media/test/test_bug895091.html => dom/media/test/test_bug895091.html rename : content/media/test/test_bug895305.html => dom/media/test/test_bug895305.html rename : content/media/test/test_bug919265.html => dom/media/test/test_bug919265.html rename : content/media/test/test_bug957847.html => dom/media/test/test_bug957847.html rename : content/media/test/test_can_play_type.html => dom/media/test/test_can_play_type.html rename : content/media/test/test_can_play_type_mpeg.html => dom/media/test/test_can_play_type_mpeg.html rename : content/media/test/test_can_play_type_no_ogg.html => dom/media/test/test_can_play_type_no_ogg.html rename : content/media/test/test_can_play_type_no_wave.html => dom/media/test/test_can_play_type_no_wave.html rename : content/media/test/test_can_play_type_no_webm.html => dom/media/test/test_can_play_type_no_webm.html rename : content/media/test/test_can_play_type_ogg.html => dom/media/test/test_can_play_type_ogg.html rename : content/media/test/test_can_play_type_wave.html => dom/media/test/test_can_play_type_wave.html rename : content/media/test/test_can_play_type_webm.html => dom/media/test/test_can_play_type_webm.html rename : content/media/test/test_chaining.html => dom/media/test/test_chaining.html rename : content/media/test/test_clone_media_element.html => dom/media/test/test_clone_media_element.html rename : content/media/test/test_closing_connections.html => dom/media/test/test_closing_connections.html rename : content/media/test/test_constants.html => dom/media/test/test_constants.html rename : content/media/test/test_contentDuration1.html => dom/media/test/test_contentDuration1.html rename : content/media/test/test_contentDuration2.html => dom/media/test/test_contentDuration2.html rename : content/media/test/test_contentDuration3.html => dom/media/test/test_contentDuration3.html rename : content/media/test/test_contentDuration4.html => dom/media/test/test_contentDuration4.html rename : content/media/test/test_contentDuration5.html => dom/media/test/test_contentDuration5.html rename : content/media/test/test_contentDuration6.html => dom/media/test/test_contentDuration6.html rename : content/media/test/test_contentDuration7.html => dom/media/test/test_contentDuration7.html rename : content/media/test/test_controls.html => dom/media/test/test_controls.html rename : content/media/test/test_currentTime.html => dom/media/test/test_currentTime.html rename : content/media/test/test_decode_error.html => dom/media/test/test_decode_error.html rename : content/media/test/test_decoder_disable.html => dom/media/test/test_decoder_disable.html rename : content/media/test/test_defaultMuted.html => dom/media/test/test_defaultMuted.html rename : content/media/test/test_delay_load.html => dom/media/test/test_delay_load.html rename : content/media/test/test_encryptedMediaExtensions.html => dom/media/test/test_encryptedMediaExtensions.html rename : content/media/test/test_error_in_video_document.html => dom/media/test/test_error_in_video_document.html rename : content/media/test/test_error_on_404.html => dom/media/test/test_error_on_404.html rename : content/media/test/test_fastSeek-forwards.html => dom/media/test/test_fastSeek-forwards.html rename : content/media/test/test_fastSeek.html => dom/media/test/test_fastSeek.html rename : content/media/test/test_fragment_noplay.html => dom/media/test/test_fragment_noplay.html rename : content/media/test/test_fragment_play.html => dom/media/test/test_fragment_play.html rename : content/media/test/test_imagecapture.html => dom/media/test/test_imagecapture.html rename : content/media/test/test_info_leak.html => dom/media/test/test_info_leak.html rename : content/media/test/test_invalid_reject.html => dom/media/test/test_invalid_reject.html rename : content/media/test/test_invalid_reject_play.html => dom/media/test/test_invalid_reject_play.html rename : content/media/test/test_invalid_seek.html => dom/media/test/test_invalid_seek.html rename : content/media/test/test_load.html => dom/media/test/test_load.html rename : content/media/test/test_load_candidates.html => dom/media/test/test_load_candidates.html rename : content/media/test/test_load_same_resource.html => dom/media/test/test_load_same_resource.html rename : content/media/test/test_load_source.html => dom/media/test/test_load_source.html rename : content/media/test/test_loop.html => dom/media/test/test_loop.html rename : content/media/test/test_media_selection.html => dom/media/test/test_media_selection.html rename : content/media/test/test_media_sniffer.html => dom/media/test/test_media_sniffer.html rename : content/media/test/test_mediarecorder_avoid_recursion.html => dom/media/test/test_mediarecorder_avoid_recursion.html rename : content/media/test/test_mediarecorder_creation.html => dom/media/test/test_mediarecorder_creation.html rename : content/media/test/test_mediarecorder_creation_fail.html => dom/media/test/test_mediarecorder_creation_fail.html rename : content/media/test/test_mediarecorder_getencodeddata.html => dom/media/test/test_mediarecorder_getencodeddata.html rename : content/media/test/test_mediarecorder_record_4ch_audiocontext.html => dom/media/test/test_mediarecorder_record_4ch_audiocontext.html rename : content/media/test/test_mediarecorder_record_audiocontext.html => dom/media/test/test_mediarecorder_record_audiocontext.html rename : content/media/test/test_mediarecorder_record_audiocontext_mlk.html => dom/media/test/test_mediarecorder_record_audiocontext_mlk.html rename : content/media/test/test_mediarecorder_record_audionode.html => dom/media/test/test_mediarecorder_record_audionode.html rename : content/media/test/test_mediarecorder_record_getdata_afterstart.html => dom/media/test/test_mediarecorder_record_getdata_afterstart.html rename : content/media/test/test_mediarecorder_record_gum_video_timeslice.html => dom/media/test/test_mediarecorder_record_gum_video_timeslice.html rename : content/media/test/test_mediarecorder_record_immediate_stop.html => dom/media/test/test_mediarecorder_record_immediate_stop.html rename : content/media/test/test_mediarecorder_record_no_timeslice.html => dom/media/test/test_mediarecorder_record_no_timeslice.html rename : content/media/test/test_mediarecorder_record_nosrc.html => dom/media/test/test_mediarecorder_record_nosrc.html rename : content/media/test/test_mediarecorder_record_session.html => dom/media/test/test_mediarecorder_record_session.html rename : content/media/test/test_mediarecorder_record_startstopstart.html => dom/media/test/test_mediarecorder_record_startstopstart.html rename : content/media/test/test_mediarecorder_record_stopms.html => dom/media/test/test_mediarecorder_record_stopms.html rename : content/media/test/test_mediarecorder_record_timeslice.html => dom/media/test/test_mediarecorder_record_timeslice.html rename : content/media/test/test_mediarecorder_reload_crash.html => dom/media/test/test_mediarecorder_reload_crash.html rename : content/media/test/test_mediarecorder_state_transition.html => dom/media/test/test_mediarecorder_state_transition.html rename : content/media/test/test_mediarecorder_unsupported_src.html => dom/media/test/test_mediarecorder_unsupported_src.html rename : content/media/test/test_mediatrack_consuming_mediaresource.html => dom/media/test/test_mediatrack_consuming_mediaresource.html rename : content/media/test/test_mediatrack_consuming_mediastream.html => dom/media/test/test_mediatrack_consuming_mediastream.html rename : content/media/test/test_mediatrack_events.html => dom/media/test/test_mediatrack_events.html rename : content/media/test/test_mediatrack_parsing_ogg.html => dom/media/test/test_mediatrack_parsing_ogg.html rename : content/media/test/test_mediatrack_replay_from_end.html => dom/media/test/test_mediatrack_replay_from_end.html rename : content/media/test/test_metadata.html => dom/media/test/test_metadata.html rename : content/media/test/test_mixed_principals.html => dom/media/test/test_mixed_principals.html rename : content/media/test/test_mozHasAudio.html => dom/media/test/test_mozHasAudio.html rename : content/media/test/test_networkState.html => dom/media/test/test_networkState.html rename : content/media/test/test_new_audio.html => dom/media/test/test_new_audio.html rename : content/media/test/test_no_load_event.html => dom/media/test/test_no_load_event.html rename : content/media/test/test_paused.html => dom/media/test/test_paused.html rename : content/media/test/test_paused_after_ended.html => dom/media/test/test_paused_after_ended.html rename : content/media/test/test_play_events.html => dom/media/test/test_play_events.html rename : content/media/test/test_play_events_2.html => dom/media/test/test_play_events_2.html rename : content/media/test/test_play_twice.html => dom/media/test/test_play_twice.html rename : content/media/test/test_playback.html => dom/media/test/test_playback.html rename : content/media/test/test_playback_errors.html => dom/media/test/test_playback_errors.html rename : content/media/test/test_playback_rate.html => dom/media/test/test_playback_rate.html rename : content/media/test/test_playback_rate_playpause.html => dom/media/test/test_playback_rate_playpause.html rename : content/media/test/test_played.html => dom/media/test/test_played.html rename : content/media/test/test_preload_actions.html => dom/media/test/test_preload_actions.html rename : content/media/test/test_preload_attribute.html => dom/media/test/test_preload_attribute.html rename : content/media/test/test_preload_suspend.html => dom/media/test/test_preload_suspend.html rename : content/media/test/test_progress.html => dom/media/test/test_progress.html rename : content/media/test/test_reactivate.html => dom/media/test/test_reactivate.html rename : content/media/test/test_readyState.html => dom/media/test/test_readyState.html rename : content/media/test/test_referer.html => dom/media/test/test_referer.html rename : content/media/test/test_replay_metadata.html => dom/media/test/test_replay_metadata.html rename : content/media/test/test_reset_events_async.html => dom/media/test/test_reset_events_async.html rename : content/media/test/test_reset_src.html => dom/media/test/test_reset_src.html rename : content/media/test/test_resume.html => dom/media/test/test_resume.html rename : content/media/test/test_seek-1.html => dom/media/test/test_seek-1.html rename : content/media/test/test_seek-10.html => dom/media/test/test_seek-10.html rename : content/media/test/test_seek-11.html => dom/media/test/test_seek-11.html rename : content/media/test/test_seek-12.html => dom/media/test/test_seek-12.html rename : content/media/test/test_seek-13.html => dom/media/test/test_seek-13.html rename : content/media/test/test_seek-2.html => dom/media/test/test_seek-2.html rename : content/media/test/test_seek-3.html => dom/media/test/test_seek-3.html rename : content/media/test/test_seek-4.html => dom/media/test/test_seek-4.html rename : content/media/test/test_seek-5.html => dom/media/test/test_seek-5.html rename : content/media/test/test_seek-6.html => dom/media/test/test_seek-6.html rename : content/media/test/test_seek-7.html => dom/media/test/test_seek-7.html rename : content/media/test/test_seek-8.html => dom/media/test/test_seek-8.html rename : content/media/test/test_seek-9.html => dom/media/test/test_seek-9.html rename : content/media/test/test_seekLies.html => dom/media/test/test_seekLies.html rename : content/media/test/test_seek_out_of_range.html => dom/media/test/test_seek_out_of_range.html rename : content/media/test/test_seekable1.html => dom/media/test/test_seekable1.html rename : content/media/test/test_seekable2.html => dom/media/test/test_seekable2.html rename : content/media/test/test_seekable3.html => dom/media/test/test_seekable3.html rename : content/media/test/test_source.html => dom/media/test/test_source.html rename : content/media/test/test_source_media.html => dom/media/test/test_source_media.html rename : content/media/test/test_source_null.html => dom/media/test/test_source_null.html rename : content/media/test/test_source_write.html => dom/media/test/test_source_write.html rename : content/media/test/test_standalone.html => dom/media/test/test_standalone.html rename : content/media/test/test_streams_autoplay.html => dom/media/test/test_streams_autoplay.html rename : content/media/test/test_streams_element_capture.html => dom/media/test/test_streams_element_capture.html rename : content/media/test/test_streams_element_capture_createObjectURL.html => dom/media/test/test_streams_element_capture_createObjectURL.html rename : content/media/test/test_streams_element_capture_playback.html => dom/media/test/test_streams_element_capture_playback.html rename : content/media/test/test_streams_element_capture_reset.html => dom/media/test/test_streams_element_capture_reset.html rename : content/media/test/test_streams_gc.html => dom/media/test/test_streams_gc.html rename : content/media/test/test_streams_srcObject.html => dom/media/test/test_streams_srcObject.html rename : content/media/test/test_streams_tracks.html => dom/media/test/test_streams_tracks.html rename : content/media/test/test_texttrack.html => dom/media/test/test_texttrack.html rename : content/media/test/test_texttrack_chrome.html => dom/media/test/test_texttrack_chrome.html rename : content/media/test/test_texttrackcue.html => dom/media/test/test_texttrackcue.html rename : content/media/test/test_texttrackcue_chrome.html => dom/media/test/test_texttrackcue_chrome.html rename : content/media/test/test_texttracklist.html => dom/media/test/test_texttracklist.html rename : content/media/test/test_texttracklist_chrome.html => dom/media/test/test_texttracklist_chrome.html rename : content/media/test/test_texttrackregion.html => dom/media/test/test_texttrackregion.html rename : content/media/test/test_timeupdate_small_files.html => dom/media/test/test_timeupdate_small_files.html rename : content/media/test/test_trackelementevent.html => dom/media/test/test_trackelementevent.html rename : content/media/test/test_trackevent.html => dom/media/test/test_trackevent.html rename : content/media/test/test_unseekable.html => dom/media/test/test_unseekable.html rename : content/media/test/test_videoDocumentTitle.html => dom/media/test/test_videoDocumentTitle.html rename : content/media/test/test_video_in_audio_element.html => dom/media/test/test_video_in_audio_element.html rename : content/media/test/test_video_to_canvas.html => dom/media/test/test_video_to_canvas.html rename : content/media/test/test_volume.html => dom/media/test/test_volume.html rename : content/media/test/test_vttparser.html => dom/media/test/test_vttparser.html rename : content/media/test/test_wav_ended1.html => dom/media/test/test_wav_ended1.html rename : content/media/test/test_wav_ended2.html => dom/media/test/test_wav_ended2.html rename : content/media/test/test_webvtt_disabled.html => dom/media/test/test_webvtt_disabled.html rename : content/media/test/variable-channel.ogg => dom/media/test/variable-channel.ogg rename : content/media/test/variable-channel.ogg^headers^ => dom/media/test/variable-channel.ogg^headers^ rename : content/media/test/variable-channel.opus => dom/media/test/variable-channel.opus rename : content/media/test/variable-channel.opus^headers^ => dom/media/test/variable-channel.opus^headers^ rename : content/media/test/variable-preskip.opus => dom/media/test/variable-preskip.opus rename : content/media/test/variable-preskip.opus^headers^ => dom/media/test/variable-preskip.opus^headers^ rename : content/media/test/variable-samplerate.ogg => dom/media/test/variable-samplerate.ogg rename : content/media/test/variable-samplerate.ogg^headers^ => dom/media/test/variable-samplerate.ogg^headers^ rename : content/media/test/variable-samplerate.opus => dom/media/test/variable-samplerate.opus rename : content/media/test/variable-samplerate.opus^headers^ => dom/media/test/variable-samplerate.opus^headers^ rename : content/media/test/vbr-head.mp3 => dom/media/test/vbr-head.mp3 rename : content/media/test/vbr-head.mp3^headers^ => dom/media/test/vbr-head.mp3^headers^ rename : content/media/test/vbr.mp3 => dom/media/test/vbr.mp3 rename : content/media/test/vbr.mp3^headers^ => dom/media/test/vbr.mp3^headers^ rename : content/media/test/video-overhang.ogg => dom/media/test/video-overhang.ogg rename : content/media/test/video-overhang.ogg^headers^ => dom/media/test/video-overhang.ogg^headers^ rename : content/media/test/vp9.webm => dom/media/test/vp9.webm rename : content/media/test/vp9.webm^headers^ => dom/media/test/vp9.webm^headers^ rename : content/media/test/vp9cake.webm => dom/media/test/vp9cake.webm rename : content/media/test/vp9cake.webm^headers^ => dom/media/test/vp9cake.webm^headers^ rename : content/media/test/wave_metadata.wav => dom/media/test/wave_metadata.wav rename : content/media/test/wave_metadata.wav^headers^ => dom/media/test/wave_metadata.wav^headers^ rename : content/media/test/wave_metadata_bad_len.wav => dom/media/test/wave_metadata_bad_len.wav rename : content/media/test/wave_metadata_bad_len.wav^headers^ => dom/media/test/wave_metadata_bad_len.wav^headers^ rename : content/media/test/wave_metadata_bad_no_null.wav => dom/media/test/wave_metadata_bad_no_null.wav rename : content/media/test/wave_metadata_bad_no_null.wav^headers^ => dom/media/test/wave_metadata_bad_no_null.wav^headers^ rename : content/media/test/wave_metadata_bad_utf8.wav => dom/media/test/wave_metadata_bad_utf8.wav rename : content/media/test/wave_metadata_bad_utf8.wav^headers^ => dom/media/test/wave_metadata_bad_utf8.wav^headers^ rename : content/media/test/wave_metadata_unknown_tag.wav => dom/media/test/wave_metadata_unknown_tag.wav rename : content/media/test/wave_metadata_unknown_tag.wav^headers^ => dom/media/test/wave_metadata_unknown_tag.wav^headers^ rename : content/media/test/wave_metadata_utf8.wav => dom/media/test/wave_metadata_utf8.wav rename : content/media/test/wave_metadata_utf8.wav^headers^ => dom/media/test/wave_metadata_utf8.wav^headers^ rename : content/media/test/wavedata_s16.wav => dom/media/test/wavedata_s16.wav rename : content/media/test/wavedata_s16.wav^headers^ => dom/media/test/wavedata_s16.wav^headers^ rename : content/media/test/wavedata_u8.wav => dom/media/test/wavedata_u8.wav rename : content/media/test/wavedata_u8.wav^headers^ => dom/media/test/wavedata_u8.wav^headers^ rename : content/media/wave/WaveDecoder.cpp => dom/media/wave/WaveDecoder.cpp rename : content/media/wave/WaveDecoder.h => dom/media/wave/WaveDecoder.h rename : content/media/wave/WaveReader.cpp => dom/media/wave/WaveReader.cpp rename : content/media/wave/WaveReader.h => dom/media/wave/WaveReader.h rename : content/media/wave/moz.build => dom/media/wave/moz.build rename : content/media/webaudio/AnalyserNode.cpp => dom/media/webaudio/AnalyserNode.cpp rename : content/media/webaudio/AnalyserNode.h => dom/media/webaudio/AnalyserNode.h rename : content/media/webaudio/AudioBuffer.cpp => dom/media/webaudio/AudioBuffer.cpp rename : content/media/webaudio/AudioBuffer.h => dom/media/webaudio/AudioBuffer.h rename : content/media/webaudio/AudioBufferSourceNode.cpp => dom/media/webaudio/AudioBufferSourceNode.cpp rename : content/media/webaudio/AudioBufferSourceNode.h => dom/media/webaudio/AudioBufferSourceNode.h rename : content/media/webaudio/AudioContext.cpp => dom/media/webaudio/AudioContext.cpp rename : content/media/webaudio/AudioContext.h => dom/media/webaudio/AudioContext.h rename : content/media/webaudio/AudioDestinationNode.cpp => dom/media/webaudio/AudioDestinationNode.cpp rename : content/media/webaudio/AudioDestinationNode.h => dom/media/webaudio/AudioDestinationNode.h rename : content/media/webaudio/AudioEventTimeline.h => dom/media/webaudio/AudioEventTimeline.h rename : content/media/webaudio/AudioListener.cpp => dom/media/webaudio/AudioListener.cpp rename : content/media/webaudio/AudioListener.h => dom/media/webaudio/AudioListener.h rename : content/media/webaudio/AudioNode.cpp => dom/media/webaudio/AudioNode.cpp rename : content/media/webaudio/AudioNode.h => dom/media/webaudio/AudioNode.h rename : content/media/webaudio/AudioNodeEngine.cpp => dom/media/webaudio/AudioNodeEngine.cpp rename : content/media/webaudio/AudioNodeEngine.h => dom/media/webaudio/AudioNodeEngine.h rename : content/media/webaudio/AudioNodeEngineNEON.cpp => dom/media/webaudio/AudioNodeEngineNEON.cpp rename : content/media/webaudio/AudioNodeEngineNEON.h => dom/media/webaudio/AudioNodeEngineNEON.h rename : content/media/webaudio/AudioNodeExternalInputStream.cpp => dom/media/webaudio/AudioNodeExternalInputStream.cpp rename : content/media/webaudio/AudioNodeExternalInputStream.h => dom/media/webaudio/AudioNodeExternalInputStream.h rename : content/media/webaudio/AudioNodeStream.cpp => dom/media/webaudio/AudioNodeStream.cpp rename : content/media/webaudio/AudioNodeStream.h => dom/media/webaudio/AudioNodeStream.h rename : content/media/webaudio/AudioParam.cpp => dom/media/webaudio/AudioParam.cpp rename : content/media/webaudio/AudioParam.h => dom/media/webaudio/AudioParam.h rename : content/media/webaudio/AudioParamTimeline.h => dom/media/webaudio/AudioParamTimeline.h rename : content/media/webaudio/AudioProcessingEvent.cpp => dom/media/webaudio/AudioProcessingEvent.cpp rename : content/media/webaudio/AudioProcessingEvent.h => dom/media/webaudio/AudioProcessingEvent.h rename : content/media/webaudio/BiquadFilterNode.cpp => dom/media/webaudio/BiquadFilterNode.cpp rename : content/media/webaudio/BiquadFilterNode.h => dom/media/webaudio/BiquadFilterNode.h rename : content/media/webaudio/BufferDecoder.cpp => dom/media/webaudio/BufferDecoder.cpp rename : content/media/webaudio/BufferDecoder.h => dom/media/webaudio/BufferDecoder.h rename : content/media/webaudio/ChannelMergerNode.cpp => dom/media/webaudio/ChannelMergerNode.cpp rename : content/media/webaudio/ChannelMergerNode.h => dom/media/webaudio/ChannelMergerNode.h rename : content/media/webaudio/ChannelSplitterNode.cpp => dom/media/webaudio/ChannelSplitterNode.cpp rename : content/media/webaudio/ChannelSplitterNode.h => dom/media/webaudio/ChannelSplitterNode.h rename : content/media/webaudio/ConvolverNode.cpp => dom/media/webaudio/ConvolverNode.cpp rename : content/media/webaudio/ConvolverNode.h => dom/media/webaudio/ConvolverNode.h rename : content/media/webaudio/DelayBuffer.cpp => dom/media/webaudio/DelayBuffer.cpp rename : content/media/webaudio/DelayBuffer.h => dom/media/webaudio/DelayBuffer.h rename : content/media/webaudio/DelayNode.cpp => dom/media/webaudio/DelayNode.cpp rename : content/media/webaudio/DelayNode.h => dom/media/webaudio/DelayNode.h rename : content/media/webaudio/DynamicsCompressorNode.cpp => dom/media/webaudio/DynamicsCompressorNode.cpp rename : content/media/webaudio/DynamicsCompressorNode.h => dom/media/webaudio/DynamicsCompressorNode.h rename : content/media/webaudio/FFTBlock.cpp => dom/media/webaudio/FFTBlock.cpp rename : content/media/webaudio/FFTBlock.h => dom/media/webaudio/FFTBlock.h rename : content/media/webaudio/GainNode.cpp => dom/media/webaudio/GainNode.cpp rename : content/media/webaudio/GainNode.h => dom/media/webaudio/GainNode.h rename : content/media/webaudio/MediaBufferDecoder.cpp => dom/media/webaudio/MediaBufferDecoder.cpp rename : content/media/webaudio/MediaBufferDecoder.h => dom/media/webaudio/MediaBufferDecoder.h rename : content/media/webaudio/MediaElementAudioSourceNode.cpp => dom/media/webaudio/MediaElementAudioSourceNode.cpp rename : content/media/webaudio/MediaElementAudioSourceNode.h => dom/media/webaudio/MediaElementAudioSourceNode.h rename : content/media/webaudio/MediaStreamAudioDestinationNode.cpp => dom/media/webaudio/MediaStreamAudioDestinationNode.cpp rename : content/media/webaudio/MediaStreamAudioDestinationNode.h => dom/media/webaudio/MediaStreamAudioDestinationNode.h rename : content/media/webaudio/MediaStreamAudioSourceNode.cpp => dom/media/webaudio/MediaStreamAudioSourceNode.cpp rename : content/media/webaudio/MediaStreamAudioSourceNode.h => dom/media/webaudio/MediaStreamAudioSourceNode.h rename : content/media/webaudio/OfflineAudioCompletionEvent.cpp => dom/media/webaudio/OfflineAudioCompletionEvent.cpp rename : content/media/webaudio/OfflineAudioCompletionEvent.h => dom/media/webaudio/OfflineAudioCompletionEvent.h rename : content/media/webaudio/OscillatorNode.cpp => dom/media/webaudio/OscillatorNode.cpp rename : content/media/webaudio/OscillatorNode.h => dom/media/webaudio/OscillatorNode.h rename : content/media/webaudio/PannerNode.cpp => dom/media/webaudio/PannerNode.cpp rename : content/media/webaudio/PannerNode.h => dom/media/webaudio/PannerNode.h rename : content/media/webaudio/PeriodicWave.cpp => dom/media/webaudio/PeriodicWave.cpp rename : content/media/webaudio/PeriodicWave.h => dom/media/webaudio/PeriodicWave.h rename : content/media/webaudio/PlayingRefChangeHandler.h => dom/media/webaudio/PlayingRefChangeHandler.h rename : content/media/webaudio/ReportDecodeResultTask.h => dom/media/webaudio/ReportDecodeResultTask.h rename : content/media/webaudio/ScriptProcessorNode.cpp => dom/media/webaudio/ScriptProcessorNode.cpp rename : content/media/webaudio/ScriptProcessorNode.h => dom/media/webaudio/ScriptProcessorNode.h rename : content/media/webaudio/ThreeDPoint.cpp => dom/media/webaudio/ThreeDPoint.cpp rename : content/media/webaudio/ThreeDPoint.h => dom/media/webaudio/ThreeDPoint.h rename : content/media/webaudio/WaveShaperNode.cpp => dom/media/webaudio/WaveShaperNode.cpp rename : content/media/webaudio/WaveShaperNode.h => dom/media/webaudio/WaveShaperNode.h rename : content/media/webaudio/WebAudioUtils.cpp => dom/media/webaudio/WebAudioUtils.cpp rename : content/media/webaudio/WebAudioUtils.h => dom/media/webaudio/WebAudioUtils.h rename : content/media/webaudio/blink/Biquad.cpp => dom/media/webaudio/blink/Biquad.cpp rename : content/media/webaudio/blink/Biquad.h => dom/media/webaudio/blink/Biquad.h rename : content/media/webaudio/blink/DenormalDisabler.h => dom/media/webaudio/blink/DenormalDisabler.h rename : content/media/webaudio/blink/DirectConvolver.cpp => dom/media/webaudio/blink/DirectConvolver.cpp rename : content/media/webaudio/blink/DirectConvolver.h => dom/media/webaudio/blink/DirectConvolver.h rename : content/media/webaudio/blink/DynamicsCompressor.cpp => dom/media/webaudio/blink/DynamicsCompressor.cpp rename : content/media/webaudio/blink/DynamicsCompressor.h => dom/media/webaudio/blink/DynamicsCompressor.h rename : content/media/webaudio/blink/DynamicsCompressorKernel.cpp => dom/media/webaudio/blink/DynamicsCompressorKernel.cpp rename : content/media/webaudio/blink/DynamicsCompressorKernel.h => dom/media/webaudio/blink/DynamicsCompressorKernel.h rename : content/media/webaudio/blink/FFTConvolver.cpp => dom/media/webaudio/blink/FFTConvolver.cpp rename : content/media/webaudio/blink/FFTConvolver.h => dom/media/webaudio/blink/FFTConvolver.h rename : content/media/webaudio/blink/HRTFDatabase.cpp => dom/media/webaudio/blink/HRTFDatabase.cpp rename : content/media/webaudio/blink/HRTFDatabase.h => dom/media/webaudio/blink/HRTFDatabase.h rename : content/media/webaudio/blink/HRTFDatabaseLoader.cpp => dom/media/webaudio/blink/HRTFDatabaseLoader.cpp rename : content/media/webaudio/blink/HRTFDatabaseLoader.h => dom/media/webaudio/blink/HRTFDatabaseLoader.h rename : content/media/webaudio/blink/HRTFElevation.cpp => dom/media/webaudio/blink/HRTFElevation.cpp rename : content/media/webaudio/blink/HRTFElevation.h => dom/media/webaudio/blink/HRTFElevation.h rename : content/media/webaudio/blink/HRTFKernel.cpp => dom/media/webaudio/blink/HRTFKernel.cpp rename : content/media/webaudio/blink/HRTFKernel.h => dom/media/webaudio/blink/HRTFKernel.h rename : content/media/webaudio/blink/HRTFPanner.cpp => dom/media/webaudio/blink/HRTFPanner.cpp rename : content/media/webaudio/blink/HRTFPanner.h => dom/media/webaudio/blink/HRTFPanner.h rename : content/media/webaudio/blink/IRC_Composite_C_R0195-incl.cpp => dom/media/webaudio/blink/IRC_Composite_C_R0195-incl.cpp rename : content/media/webaudio/blink/PeriodicWave.cpp => dom/media/webaudio/blink/PeriodicWave.cpp rename : content/media/webaudio/blink/PeriodicWave.h => dom/media/webaudio/blink/PeriodicWave.h rename : content/media/webaudio/blink/README => dom/media/webaudio/blink/README rename : content/media/webaudio/blink/Reverb.cpp => dom/media/webaudio/blink/Reverb.cpp rename : content/media/webaudio/blink/Reverb.h => dom/media/webaudio/blink/Reverb.h rename : content/media/webaudio/blink/ReverbAccumulationBuffer.cpp => dom/media/webaudio/blink/ReverbAccumulationBuffer.cpp rename : content/media/webaudio/blink/ReverbAccumulationBuffer.h => dom/media/webaudio/blink/ReverbAccumulationBuffer.h rename : content/media/webaudio/blink/ReverbConvolver.cpp => dom/media/webaudio/blink/ReverbConvolver.cpp rename : content/media/webaudio/blink/ReverbConvolver.h => dom/media/webaudio/blink/ReverbConvolver.h rename : content/media/webaudio/blink/ReverbConvolverStage.cpp => dom/media/webaudio/blink/ReverbConvolverStage.cpp rename : content/media/webaudio/blink/ReverbConvolverStage.h => dom/media/webaudio/blink/ReverbConvolverStage.h rename : content/media/webaudio/blink/ReverbInputBuffer.cpp => dom/media/webaudio/blink/ReverbInputBuffer.cpp rename : content/media/webaudio/blink/ReverbInputBuffer.h => dom/media/webaudio/blink/ReverbInputBuffer.h rename : content/media/webaudio/blink/ZeroPole.cpp => dom/media/webaudio/blink/ZeroPole.cpp rename : content/media/webaudio/blink/ZeroPole.h => dom/media/webaudio/blink/ZeroPole.h rename : content/media/webaudio/blink/moz.build => dom/media/webaudio/blink/moz.build rename : content/media/webaudio/compiledtest/TestAudioEventTimeline.cpp => dom/media/webaudio/compiledtest/TestAudioEventTimeline.cpp rename : content/media/webaudio/compiledtest/moz.build => dom/media/webaudio/compiledtest/moz.build rename : content/media/webaudio/moz.build => dom/media/webaudio/moz.build rename : content/media/webaudio/test/audio-expected.wav => dom/media/webaudio/test/audio-expected.wav rename : content/media/webaudio/test/audio-mono-expected-2.wav => dom/media/webaudio/test/audio-mono-expected-2.wav rename : content/media/webaudio/test/audio-mono-expected.wav => dom/media/webaudio/test/audio-mono-expected.wav rename : content/media/webaudio/test/audio-quad.wav => dom/media/webaudio/test/audio-quad.wav rename : content/media/webaudio/test/audio.ogv => dom/media/webaudio/test/audio.ogv rename : content/media/webaudio/test/audioBufferSourceNodeNeutered_worker.js => dom/media/webaudio/test/audioBufferSourceNodeNeutered_worker.js rename : content/media/webaudio/test/blink/README => dom/media/webaudio/test/blink/README rename : content/media/webaudio/test/blink/audio-testing.js => dom/media/webaudio/test/blink/audio-testing.js rename : content/media/webaudio/test/blink/convolution-testing.js => dom/media/webaudio/test/blink/convolution-testing.js rename : content/media/webaudio/test/blink/mochitest.ini => dom/media/webaudio/test/blink/mochitest.ini rename : content/media/webaudio/test/blink/panner-model-testing.js => dom/media/webaudio/test/blink/panner-model-testing.js rename : content/media/webaudio/test/browser.ini => dom/media/webaudio/test/browser.ini rename : content/media/webaudio/test/browser_mozAudioChannel.html => dom/media/webaudio/test/browser_mozAudioChannel.html rename : content/media/webaudio/test/browser_mozAudioChannel.js => dom/media/webaudio/test/browser_mozAudioChannel.js rename : content/media/webaudio/test/browser_mozAudioChannel_muted.html => dom/media/webaudio/test/browser_mozAudioChannel_muted.html rename : content/media/webaudio/test/browser_mozAudioChannel_muted.js => dom/media/webaudio/test/browser_mozAudioChannel_muted.js rename : content/media/webaudio/test/chrome.ini => dom/media/webaudio/test/chrome.ini rename : content/media/webaudio/test/invalid.txt => dom/media/webaudio/test/invalid.txt rename : content/media/webaudio/test/layouttest-glue.js => dom/media/webaudio/test/layouttest-glue.js rename : content/media/webaudio/test/mochitest.ini => dom/media/webaudio/test/mochitest.ini rename : content/media/webaudio/test/noaudio.webm => dom/media/webaudio/test/noaudio.webm rename : content/media/webaudio/test/small-shot-expected.wav => dom/media/webaudio/test/small-shot-expected.wav rename : content/media/webaudio/test/small-shot-mono-expected.wav => dom/media/webaudio/test/small-shot-mono-expected.wav rename : content/media/webaudio/test/small-shot.mp3 => dom/media/webaudio/test/small-shot.mp3 rename : content/media/webaudio/test/small-shot.ogg => dom/media/webaudio/test/small-shot.ogg rename : content/media/webaudio/test/test_AudioBuffer.html => dom/media/webaudio/test/test_AudioBuffer.html rename : content/media/webaudio/test/test_AudioContext.html => dom/media/webaudio/test/test_AudioContext.html rename : content/media/webaudio/test/test_AudioListener.html => dom/media/webaudio/test/test_AudioListener.html rename : content/media/webaudio/test/test_AudioNodeDevtoolsAPI.html => dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html rename : content/media/webaudio/test/test_OfflineAudioContext.html => dom/media/webaudio/test/test_OfflineAudioContext.html rename : content/media/webaudio/test/test_analyserNode.html => dom/media/webaudio/test/test_analyserNode.html rename : content/media/webaudio/test/test_analyserNodeOutput.html => dom/media/webaudio/test/test_analyserNodeOutput.html rename : content/media/webaudio/test/test_analyserNodePassThrough.html => dom/media/webaudio/test/test_analyserNodePassThrough.html rename : content/media/webaudio/test/test_audioBufferSourceNode.html => dom/media/webaudio/test/test_audioBufferSourceNode.html rename : content/media/webaudio/test/test_audioBufferSourceNodeEnded.html => dom/media/webaudio/test/test_audioBufferSourceNodeEnded.html rename : content/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html => dom/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html rename : content/media/webaudio/test/test_audioBufferSourceNodeLoop.html => dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html rename : content/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html => dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html rename : content/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html => dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html rename : content/media/webaudio/test/test_audioBufferSourceNodeNeutered.html => dom/media/webaudio/test/test_audioBufferSourceNodeNeutered.html rename : content/media/webaudio/test/test_audioBufferSourceNodeNoStart.html => dom/media/webaudio/test/test_audioBufferSourceNodeNoStart.html rename : content/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html => dom/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html rename : content/media/webaudio/test/test_audioBufferSourceNodeOffset.html => dom/media/webaudio/test/test_audioBufferSourceNodeOffset.html rename : content/media/webaudio/test/test_audioBufferSourceNodePassThrough.html => dom/media/webaudio/test/test_audioBufferSourceNodePassThrough.html rename : content/media/webaudio/test/test_audioDestinationNode.html => dom/media/webaudio/test/test_audioDestinationNode.html rename : content/media/webaudio/test/test_audioParamExponentialRamp.html => dom/media/webaudio/test/test_audioParamExponentialRamp.html rename : content/media/webaudio/test/test_audioParamGain.html => dom/media/webaudio/test/test_audioParamGain.html rename : content/media/webaudio/test/test_audioParamLinearRamp.html => dom/media/webaudio/test/test_audioParamLinearRamp.html rename : content/media/webaudio/test/test_audioParamSetCurveAtTime.html => dom/media/webaudio/test/test_audioParamSetCurveAtTime.html rename : content/media/webaudio/test/test_audioParamSetCurveAtTimeZeroDuration.html => dom/media/webaudio/test/test_audioParamSetCurveAtTimeZeroDuration.html rename : content/media/webaudio/test/test_audioParamSetTargetAtTime.html => dom/media/webaudio/test/test_audioParamSetTargetAtTime.html rename : content/media/webaudio/test/test_audioParamSetValueAtTime.html => dom/media/webaudio/test/test_audioParamSetValueAtTime.html rename : content/media/webaudio/test/test_audioParamTimelineDestinationOffset.html => dom/media/webaudio/test/test_audioParamTimelineDestinationOffset.html rename : content/media/webaudio/test/test_badConnect.html => dom/media/webaudio/test/test_badConnect.html rename : content/media/webaudio/test/test_biquadFilterNode.html => dom/media/webaudio/test/test_biquadFilterNode.html rename : content/media/webaudio/test/test_biquadFilterNodePassThrough.html => dom/media/webaudio/test/test_biquadFilterNodePassThrough.html rename : content/media/webaudio/test/test_biquadFilterNodeWithGain.html => dom/media/webaudio/test/test_biquadFilterNodeWithGain.html rename : content/media/webaudio/test/test_bug1056032.html => dom/media/webaudio/test/test_bug1056032.html rename : content/media/webaudio/test/test_bug808374.html => dom/media/webaudio/test/test_bug808374.html rename : content/media/webaudio/test/test_bug827541.html => dom/media/webaudio/test/test_bug827541.html rename : content/media/webaudio/test/test_bug839753.html => dom/media/webaudio/test/test_bug839753.html rename : content/media/webaudio/test/test_bug845960.html => dom/media/webaudio/test/test_bug845960.html rename : content/media/webaudio/test/test_bug856771.html => dom/media/webaudio/test/test_bug856771.html rename : content/media/webaudio/test/test_bug866570.html => dom/media/webaudio/test/test_bug866570.html rename : content/media/webaudio/test/test_bug866737.html => dom/media/webaudio/test/test_bug866737.html rename : content/media/webaudio/test/test_bug867089.html => dom/media/webaudio/test/test_bug867089.html rename : content/media/webaudio/test/test_bug867104.html => dom/media/webaudio/test/test_bug867104.html rename : content/media/webaudio/test/test_bug867174.html => dom/media/webaudio/test/test_bug867174.html rename : content/media/webaudio/test/test_bug867203.html => dom/media/webaudio/test/test_bug867203.html rename : content/media/webaudio/test/test_bug875221.html => dom/media/webaudio/test/test_bug875221.html rename : content/media/webaudio/test/test_bug875402.html => dom/media/webaudio/test/test_bug875402.html rename : content/media/webaudio/test/test_bug894150.html => dom/media/webaudio/test/test_bug894150.html rename : content/media/webaudio/test/test_bug956489.html => dom/media/webaudio/test/test_bug956489.html rename : content/media/webaudio/test/test_bug964376.html => dom/media/webaudio/test/test_bug964376.html rename : content/media/webaudio/test/test_bug972678.html => dom/media/webaudio/test/test_bug972678.html rename : content/media/webaudio/test/test_channelMergerNode.html => dom/media/webaudio/test/test_channelMergerNode.html rename : content/media/webaudio/test/test_channelMergerNodeWithVolume.html => dom/media/webaudio/test/test_channelMergerNodeWithVolume.html rename : content/media/webaudio/test/test_channelSplitterNode.html => dom/media/webaudio/test/test_channelSplitterNode.html rename : content/media/webaudio/test/test_channelSplitterNodeWithVolume.html => dom/media/webaudio/test/test_channelSplitterNodeWithVolume.html rename : content/media/webaudio/test/test_convolverNode.html => dom/media/webaudio/test/test_convolverNode.html rename : content/media/webaudio/test/test_convolverNodeChannelCount.html => dom/media/webaudio/test/test_convolverNodeChannelCount.html rename : content/media/webaudio/test/test_convolverNodePassThrough.html => dom/media/webaudio/test/test_convolverNodePassThrough.html rename : content/media/webaudio/test/test_convolverNodeWithGain.html => dom/media/webaudio/test/test_convolverNodeWithGain.html rename : content/media/webaudio/test/test_convolverNode_mono_mono.html => dom/media/webaudio/test/test_convolverNode_mono_mono.html rename : content/media/webaudio/test/test_currentTime.html => dom/media/webaudio/test/test_currentTime.html rename : content/media/webaudio/test/test_decodeMultichannel.html => dom/media/webaudio/test/test_decodeMultichannel.html rename : content/media/webaudio/test/test_delayNode.html => dom/media/webaudio/test/test_delayNode.html rename : content/media/webaudio/test/test_delayNodeAtMax.html => dom/media/webaudio/test/test_delayNodeAtMax.html rename : content/media/webaudio/test/test_delayNodeChannelChanges.html => dom/media/webaudio/test/test_delayNodeChannelChanges.html rename : content/media/webaudio/test/test_delayNodeCycles.html => dom/media/webaudio/test/test_delayNodeCycles.html rename : content/media/webaudio/test/test_delayNodePassThrough.html => dom/media/webaudio/test/test_delayNodePassThrough.html rename : content/media/webaudio/test/test_delayNodeSmallMaxDelay.html => dom/media/webaudio/test/test_delayNodeSmallMaxDelay.html rename : content/media/webaudio/test/test_delayNodeTailIncrease.html => dom/media/webaudio/test/test_delayNodeTailIncrease.html rename : content/media/webaudio/test/test_delayNodeTailWithDisconnect.html => dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html rename : content/media/webaudio/test/test_delayNodeTailWithGain.html => dom/media/webaudio/test/test_delayNodeTailWithGain.html rename : content/media/webaudio/test/test_delayNodeTailWithReconnect.html => dom/media/webaudio/test/test_delayNodeTailWithReconnect.html rename : content/media/webaudio/test/test_delayNodeWithGain.html => dom/media/webaudio/test/test_delayNodeWithGain.html rename : content/media/webaudio/test/test_dynamicsCompressorNode.html => dom/media/webaudio/test/test_dynamicsCompressorNode.html rename : content/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html => dom/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html rename : content/media/webaudio/test/test_gainNode.html => dom/media/webaudio/test/test_gainNode.html rename : content/media/webaudio/test/test_gainNodeInLoop.html => dom/media/webaudio/test/test_gainNodeInLoop.html rename : content/media/webaudio/test/test_gainNodePassThrough.html => dom/media/webaudio/test/test_gainNodePassThrough.html rename : content/media/webaudio/test/test_maxChannelCount.html => dom/media/webaudio/test/test_maxChannelCount.html rename : content/media/webaudio/test/test_mediaDecoding.html => dom/media/webaudio/test/test_mediaDecoding.html rename : content/media/webaudio/test/test_mediaElementAudioSourceNode.html => dom/media/webaudio/test/test_mediaElementAudioSourceNode.html rename : content/media/webaudio/test/test_mediaElementAudioSourceNodePassThrough.html => dom/media/webaudio/test/test_mediaElementAudioSourceNodePassThrough.html rename : content/media/webaudio/test/test_mediaStreamAudioDestinationNode.html => dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html rename : content/media/webaudio/test/test_mediaStreamAudioSourceNode.html => dom/media/webaudio/test/test_mediaStreamAudioSourceNode.html rename : content/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html => dom/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html rename : content/media/webaudio/test/test_mediaStreamAudioSourceNodePassThrough.html => dom/media/webaudio/test/test_mediaStreamAudioSourceNodePassThrough.html rename : content/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html => dom/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html rename : content/media/webaudio/test/test_mixingRules.html => dom/media/webaudio/test/test_mixingRules.html rename : content/media/webaudio/test/test_mozaudiochannel.html => dom/media/webaudio/test/test_mozaudiochannel.html rename : content/media/webaudio/test/test_nodeToParamConnection.html => dom/media/webaudio/test/test_nodeToParamConnection.html rename : content/media/webaudio/test/test_offlineDestinationChannelCountLess.html => dom/media/webaudio/test/test_offlineDestinationChannelCountLess.html rename : content/media/webaudio/test/test_offlineDestinationChannelCountMore.html => dom/media/webaudio/test/test_offlineDestinationChannelCountMore.html rename : content/media/webaudio/test/test_oscillatorNode.html => dom/media/webaudio/test/test_oscillatorNode.html rename : content/media/webaudio/test/test_oscillatorNode2.html => dom/media/webaudio/test/test_oscillatorNode2.html rename : content/media/webaudio/test/test_oscillatorNodePassThrough.html => dom/media/webaudio/test/test_oscillatorNodePassThrough.html rename : content/media/webaudio/test/test_oscillatorNodeStart.html => dom/media/webaudio/test/test_oscillatorNodeStart.html rename : content/media/webaudio/test/test_oscillatorTypeChange.html => dom/media/webaudio/test/test_oscillatorTypeChange.html rename : content/media/webaudio/test/test_pannerNode.html => dom/media/webaudio/test/test_pannerNode.html rename : content/media/webaudio/test/test_pannerNodeAbove.html => dom/media/webaudio/test/test_pannerNodeAbove.html rename : content/media/webaudio/test/test_pannerNodeChannelCount.html => dom/media/webaudio/test/test_pannerNodeChannelCount.html rename : content/media/webaudio/test/test_pannerNodeHRTFSymmetry.html => dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html rename : content/media/webaudio/test/test_pannerNodePassThrough.html => dom/media/webaudio/test/test_pannerNodePassThrough.html rename : content/media/webaudio/test/test_pannerNodeTail.html => dom/media/webaudio/test/test_pannerNodeTail.html rename : content/media/webaudio/test/test_pannerNode_equalPower.html => dom/media/webaudio/test/test_pannerNode_equalPower.html rename : content/media/webaudio/test/test_periodicWave.html => dom/media/webaudio/test/test_periodicWave.html rename : content/media/webaudio/test/test_scriptProcessorNode.html => dom/media/webaudio/test/test_scriptProcessorNode.html rename : content/media/webaudio/test/test_scriptProcessorNodeChannelCount.html => dom/media/webaudio/test/test_scriptProcessorNodeChannelCount.html rename : content/media/webaudio/test/test_scriptProcessorNodeNotConnected.html => dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html rename : content/media/webaudio/test/test_scriptProcessorNodePassThrough.html => dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html rename : content/media/webaudio/test/test_scriptProcessorNodeZeroInputOutput.html => dom/media/webaudio/test/test_scriptProcessorNodeZeroInputOutput.html rename : content/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html => dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html rename : content/media/webaudio/test/test_singleSourceDest.html => dom/media/webaudio/test/test_singleSourceDest.html rename : content/media/webaudio/test/test_stereoPanningWithGain.html => dom/media/webaudio/test/test_stereoPanningWithGain.html rename : content/media/webaudio/test/test_waveDecoder.html => dom/media/webaudio/test/test_waveDecoder.html rename : content/media/webaudio/test/test_waveShaper.html => dom/media/webaudio/test/test_waveShaper.html rename : content/media/webaudio/test/test_waveShaperNoCurve.html => dom/media/webaudio/test/test_waveShaperNoCurve.html rename : content/media/webaudio/test/test_waveShaperPassThrough.html => dom/media/webaudio/test/test_waveShaperPassThrough.html rename : content/media/webaudio/test/test_waveShaperZeroLengthCurve.html => dom/media/webaudio/test/test_waveShaperZeroLengthCurve.html rename : content/media/webaudio/test/ting-44.1k-1ch.ogg => dom/media/webaudio/test/ting-44.1k-1ch.ogg rename : content/media/webaudio/test/ting-44.1k-1ch.wav => dom/media/webaudio/test/ting-44.1k-1ch.wav rename : content/media/webaudio/test/ting-44.1k-2ch.ogg => dom/media/webaudio/test/ting-44.1k-2ch.ogg rename : content/media/webaudio/test/ting-44.1k-2ch.wav => dom/media/webaudio/test/ting-44.1k-2ch.wav rename : content/media/webaudio/test/ting-48k-1ch.ogg => dom/media/webaudio/test/ting-48k-1ch.ogg rename : content/media/webaudio/test/ting-48k-1ch.wav => dom/media/webaudio/test/ting-48k-1ch.wav rename : content/media/webaudio/test/ting-48k-2ch.ogg => dom/media/webaudio/test/ting-48k-2ch.ogg rename : content/media/webaudio/test/ting-48k-2ch.wav => dom/media/webaudio/test/ting-48k-2ch.wav rename : content/media/webaudio/test/ting-dualchannel44.1.wav => dom/media/webaudio/test/ting-dualchannel44.1.wav rename : content/media/webaudio/test/ting-dualchannel48.wav => dom/media/webaudio/test/ting-dualchannel48.wav rename : content/media/webaudio/test/webaudio.js => dom/media/webaudio/test/webaudio.js rename : content/media/webm/EbmlComposer.cpp => dom/media/webm/EbmlComposer.cpp rename : content/media/webm/EbmlComposer.h => dom/media/webm/EbmlComposer.h rename : content/media/webm/WebMBufferedParser.cpp => dom/media/webm/WebMBufferedParser.cpp rename : content/media/webm/WebMBufferedParser.h => dom/media/webm/WebMBufferedParser.h rename : content/media/webm/WebMDecoder.cpp => dom/media/webm/WebMDecoder.cpp rename : content/media/webm/WebMDecoder.h => dom/media/webm/WebMDecoder.h rename : content/media/webm/WebMReader.cpp => dom/media/webm/WebMReader.cpp rename : content/media/webm/WebMReader.h => dom/media/webm/WebMReader.h rename : content/media/webm/WebMWriter.cpp => dom/media/webm/WebMWriter.cpp rename : content/media/webm/WebMWriter.h => dom/media/webm/WebMWriter.h rename : content/media/webm/moz.build => dom/media/webm/moz.build rename : content/media/webrtc/AudioOutputObserver.h => dom/media/webrtc/AudioOutputObserver.h rename : content/media/webrtc/MediaEngine.h => dom/media/webrtc/MediaEngine.h rename : content/media/webrtc/MediaEngineCameraVideoSource.cpp => dom/media/webrtc/MediaEngineCameraVideoSource.cpp rename : content/media/webrtc/MediaEngineCameraVideoSource.h => dom/media/webrtc/MediaEngineCameraVideoSource.h rename : content/media/webrtc/MediaEngineDefault.cpp => dom/media/webrtc/MediaEngineDefault.cpp rename : content/media/webrtc/MediaEngineDefault.h => dom/media/webrtc/MediaEngineDefault.h rename : content/media/webrtc/MediaEngineGonkVideoSource.cpp => dom/media/webrtc/MediaEngineGonkVideoSource.cpp rename : content/media/webrtc/MediaEngineGonkVideoSource.h => dom/media/webrtc/MediaEngineGonkVideoSource.h rename : content/media/webrtc/MediaEngineTabVideoSource.cpp => dom/media/webrtc/MediaEngineTabVideoSource.cpp rename : content/media/webrtc/MediaEngineTabVideoSource.h => dom/media/webrtc/MediaEngineTabVideoSource.h rename : content/media/webrtc/MediaEngineWebRTC.cpp => dom/media/webrtc/MediaEngineWebRTC.cpp rename : content/media/webrtc/MediaEngineWebRTC.h => dom/media/webrtc/MediaEngineWebRTC.h rename : content/media/webrtc/MediaEngineWebRTCAudio.cpp => dom/media/webrtc/MediaEngineWebRTCAudio.cpp rename : content/media/webrtc/MediaEngineWebRTCVideo.cpp => dom/media/webrtc/MediaEngineWebRTCVideo.cpp rename : content/media/webrtc/MediaTrackConstraints.h => dom/media/webrtc/MediaTrackConstraints.h rename : content/media/webrtc/PeerIdentity.cpp => dom/media/webrtc/PeerIdentity.cpp rename : content/media/webrtc/PeerIdentity.h => dom/media/webrtc/PeerIdentity.h rename : content/media/webrtc/moz.build => dom/media/webrtc/moz.build rename : content/media/webrtc/nsITabSource.idl => dom/media/webrtc/nsITabSource.idl rename : content/media/webspeech/moz.build => dom/media/webspeech/moz.build rename : content/media/webspeech/recognition/SpeechGrammar.cpp => dom/media/webspeech/recognition/SpeechGrammar.cpp rename : content/media/webspeech/recognition/SpeechGrammar.h => dom/media/webspeech/recognition/SpeechGrammar.h rename : content/media/webspeech/recognition/SpeechGrammarList.cpp => dom/media/webspeech/recognition/SpeechGrammarList.cpp rename : content/media/webspeech/recognition/SpeechGrammarList.h => dom/media/webspeech/recognition/SpeechGrammarList.h rename : content/media/webspeech/recognition/SpeechRecognition.cpp => dom/media/webspeech/recognition/SpeechRecognition.cpp rename : content/media/webspeech/recognition/SpeechRecognition.h => dom/media/webspeech/recognition/SpeechRecognition.h rename : content/media/webspeech/recognition/SpeechRecognitionAlternative.cpp => dom/media/webspeech/recognition/SpeechRecognitionAlternative.cpp rename : content/media/webspeech/recognition/SpeechRecognitionAlternative.h => dom/media/webspeech/recognition/SpeechRecognitionAlternative.h rename : content/media/webspeech/recognition/SpeechRecognitionResult.cpp => dom/media/webspeech/recognition/SpeechRecognitionResult.cpp rename : content/media/webspeech/recognition/SpeechRecognitionResult.h => dom/media/webspeech/recognition/SpeechRecognitionResult.h rename : content/media/webspeech/recognition/SpeechRecognitionResultList.cpp => dom/media/webspeech/recognition/SpeechRecognitionResultList.cpp rename : content/media/webspeech/recognition/SpeechRecognitionResultList.h => dom/media/webspeech/recognition/SpeechRecognitionResultList.h rename : content/media/webspeech/recognition/SpeechStreamListener.cpp => dom/media/webspeech/recognition/SpeechStreamListener.cpp rename : content/media/webspeech/recognition/SpeechStreamListener.h => dom/media/webspeech/recognition/SpeechStreamListener.h rename : content/media/webspeech/recognition/endpointer.cc => dom/media/webspeech/recognition/endpointer.cc rename : content/media/webspeech/recognition/endpointer.h => dom/media/webspeech/recognition/endpointer.h rename : content/media/webspeech/recognition/energy_endpointer.cc => dom/media/webspeech/recognition/energy_endpointer.cc rename : content/media/webspeech/recognition/energy_endpointer.h => dom/media/webspeech/recognition/energy_endpointer.h rename : content/media/webspeech/recognition/energy_endpointer_params.cc => dom/media/webspeech/recognition/energy_endpointer_params.cc rename : content/media/webspeech/recognition/energy_endpointer_params.h => dom/media/webspeech/recognition/energy_endpointer_params.h rename : content/media/webspeech/recognition/moz.build => dom/media/webspeech/recognition/moz.build rename : content/media/webspeech/recognition/nsISpeechRecognitionService.idl => dom/media/webspeech/recognition/nsISpeechRecognitionService.idl rename : content/media/webspeech/recognition/test/FakeSpeechRecognitionService.cpp => dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.cpp rename : content/media/webspeech/recognition/test/FakeSpeechRecognitionService.h => dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.h rename : content/media/webspeech/recognition/test/head.js => dom/media/webspeech/recognition/test/head.js rename : content/media/webspeech/recognition/test/hello.ogg => dom/media/webspeech/recognition/test/hello.ogg rename : content/media/webspeech/recognition/test/hello.ogg^headers^ => dom/media/webspeech/recognition/test/hello.ogg^headers^ rename : content/media/webspeech/recognition/test/mochitest.ini => dom/media/webspeech/recognition/test/mochitest.ini rename : content/media/webspeech/recognition/test/silence.ogg => dom/media/webspeech/recognition/test/silence.ogg rename : content/media/webspeech/recognition/test/silence.ogg^headers^ => dom/media/webspeech/recognition/test/silence.ogg^headers^ rename : content/media/webspeech/recognition/test/test_abort.html => dom/media/webspeech/recognition/test/test_abort.html rename : content/media/webspeech/recognition/test/test_audio_capture_error.html => dom/media/webspeech/recognition/test/test_audio_capture_error.html rename : content/media/webspeech/recognition/test/test_call_start_from_end_handler.html => dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html rename : content/media/webspeech/recognition/test/test_nested_eventloop.html => dom/media/webspeech/recognition/test/test_nested_eventloop.html rename : content/media/webspeech/recognition/test/test_preference_enable.html => dom/media/webspeech/recognition/test/test_preference_enable.html rename : content/media/webspeech/recognition/test/test_recognition_service_error.html => dom/media/webspeech/recognition/test/test_recognition_service_error.html rename : content/media/webspeech/recognition/test/test_success_without_recognition_service.html => dom/media/webspeech/recognition/test/test_success_without_recognition_service.html rename : content/media/webspeech/recognition/test/test_timeout.html => dom/media/webspeech/recognition/test/test_timeout.html rename : content/media/webspeech/synth/SpeechSynthesis.cpp => dom/media/webspeech/synth/SpeechSynthesis.cpp rename : content/media/webspeech/synth/SpeechSynthesis.h => dom/media/webspeech/synth/SpeechSynthesis.h rename : content/media/webspeech/synth/SpeechSynthesisUtterance.cpp => dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp rename : content/media/webspeech/synth/SpeechSynthesisUtterance.h => dom/media/webspeech/synth/SpeechSynthesisUtterance.h rename : content/media/webspeech/synth/SpeechSynthesisVoice.cpp => dom/media/webspeech/synth/SpeechSynthesisVoice.cpp rename : content/media/webspeech/synth/SpeechSynthesisVoice.h => dom/media/webspeech/synth/SpeechSynthesisVoice.h rename : content/media/webspeech/synth/ipc/PSpeechSynthesis.ipdl => dom/media/webspeech/synth/ipc/PSpeechSynthesis.ipdl rename : content/media/webspeech/synth/ipc/PSpeechSynthesisRequest.ipdl => dom/media/webspeech/synth/ipc/PSpeechSynthesisRequest.ipdl rename : content/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp => dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp rename : content/media/webspeech/synth/ipc/SpeechSynthesisChild.h => dom/media/webspeech/synth/ipc/SpeechSynthesisChild.h rename : content/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp => dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp rename : content/media/webspeech/synth/ipc/SpeechSynthesisParent.h => dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h rename : content/media/webspeech/synth/ipc/test/file_ipc.html => dom/media/webspeech/synth/ipc/test/file_ipc.html rename : content/media/webspeech/synth/ipc/test/mochitest.ini => dom/media/webspeech/synth/ipc/test/mochitest.ini rename : content/media/webspeech/synth/ipc/test/test_ipc.html => dom/media/webspeech/synth/ipc/test/test_ipc.html rename : content/media/webspeech/synth/moz.build => dom/media/webspeech/synth/moz.build rename : content/media/webspeech/synth/nsISpeechService.idl => dom/media/webspeech/synth/nsISpeechService.idl rename : content/media/webspeech/synth/nsISynthVoiceRegistry.idl => dom/media/webspeech/synth/nsISynthVoiceRegistry.idl rename : content/media/webspeech/synth/nsSpeechTask.cpp => dom/media/webspeech/synth/nsSpeechTask.cpp rename : content/media/webspeech/synth/nsSpeechTask.h => dom/media/webspeech/synth/nsSpeechTask.h rename : content/media/webspeech/synth/nsSynthVoiceRegistry.cpp => dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp rename : content/media/webspeech/synth/nsSynthVoiceRegistry.h => dom/media/webspeech/synth/nsSynthVoiceRegistry.h rename : content/media/webspeech/synth/pico/PicoModule.cpp => dom/media/webspeech/synth/pico/PicoModule.cpp rename : content/media/webspeech/synth/pico/moz.build => dom/media/webspeech/synth/pico/moz.build rename : content/media/webspeech/synth/pico/nsPicoService.cpp => dom/media/webspeech/synth/pico/nsPicoService.cpp rename : content/media/webspeech/synth/pico/nsPicoService.h => dom/media/webspeech/synth/pico/nsPicoService.h rename : content/media/webspeech/synth/test/common.js => dom/media/webspeech/synth/test/common.js rename : content/media/webspeech/synth/test/file_setup.html => dom/media/webspeech/synth/test/file_setup.html rename : content/media/webspeech/synth/test/file_speech_queue.html => dom/media/webspeech/synth/test/file_speech_queue.html rename : content/media/webspeech/synth/test/file_speech_simple.html => dom/media/webspeech/synth/test/file_speech_simple.html rename : content/media/webspeech/synth/test/mochitest.ini => dom/media/webspeech/synth/test/mochitest.ini rename : content/media/webspeech/synth/test/test_setup.html => dom/media/webspeech/synth/test/test_setup.html rename : content/media/webspeech/synth/test/test_speech_queue.html => dom/media/webspeech/synth/test/test_speech_queue.html rename : content/media/webspeech/synth/test/test_speech_simple.html => dom/media/webspeech/synth/test/test_speech_simple.html rename : content/media/webvtt/WebVTT.manifest => dom/media/webvtt/WebVTT.manifest rename : content/media/webvtt/WebVTTParserWrapper.js => dom/media/webvtt/WebVTTParserWrapper.js rename : content/media/webvtt/moz.build => dom/media/webvtt/moz.build rename : content/media/webvtt/nsIWebVTTListener.idl => dom/media/webvtt/nsIWebVTTListener.idl rename : content/media/webvtt/nsIWebVTTParserWrapper.idl => dom/media/webvtt/nsIWebVTTParserWrapper.idl rename : content/media/webvtt/package.json => dom/media/webvtt/package.json rename : content/media/webvtt/update-webvtt.js => dom/media/webvtt/update-webvtt.js rename : content/media/webvtt/vtt.jsm => dom/media/webvtt/vtt.jsm rename : content/media/wmf/DXVA2Manager.cpp => dom/media/wmf/DXVA2Manager.cpp rename : content/media/wmf/DXVA2Manager.h => dom/media/wmf/DXVA2Manager.h rename : content/media/wmf/WMF.h => dom/media/wmf/WMF.h rename : content/media/wmf/WMFByteStream.cpp => dom/media/wmf/WMFByteStream.cpp rename : content/media/wmf/WMFByteStream.h => dom/media/wmf/WMFByteStream.h rename : content/media/wmf/WMFDecoder.cpp => dom/media/wmf/WMFDecoder.cpp rename : content/media/wmf/WMFDecoder.h => dom/media/wmf/WMFDecoder.h rename : content/media/wmf/WMFReader.cpp => dom/media/wmf/WMFReader.cpp rename : content/media/wmf/WMFReader.h => dom/media/wmf/WMFReader.h rename : content/media/wmf/WMFSourceReaderCallback.cpp => dom/media/wmf/WMFSourceReaderCallback.cpp rename : content/media/wmf/WMFSourceReaderCallback.h => dom/media/wmf/WMFSourceReaderCallback.h rename : content/media/wmf/WMFUtils.cpp => dom/media/wmf/WMFUtils.cpp rename : content/media/wmf/WMFUtils.h => dom/media/wmf/WMFUtils.h rename : content/media/wmf/moz.build => dom/media/wmf/moz.build
2429 lines
82 KiB
C++
2429 lines
82 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/ReentrantMonitor.h"
|
|
|
|
#include "MediaCache.h"
|
|
#include "prio.h"
|
|
#include "nsContentUtils.h"
|
|
#include "nsThreadUtils.h"
|
|
#include "MediaResource.h"
|
|
#include "prlog.h"
|
|
#include "mozilla/Preferences.h"
|
|
#include "FileBlockCache.h"
|
|
#include "nsAnonymousTemporaryFile.h"
|
|
#include "nsIObserverService.h"
|
|
#include "nsISeekableStream.h"
|
|
#include "nsIPrincipal.h"
|
|
#include "mozilla/Attributes.h"
|
|
#include "mozilla/Services.h"
|
|
#include <algorithm>
|
|
|
|
namespace mozilla {
|
|
|
|
#ifdef PR_LOGGING
|
|
PRLogModuleInfo* gMediaCacheLog;
|
|
#define CACHE_LOG(type, msg) PR_LOG(gMediaCacheLog, type, msg)
|
|
#else
|
|
#define CACHE_LOG(type, msg)
|
|
#endif
|
|
|
|
// Readahead blocks for non-seekable streams will be limited to this
|
|
// fraction of the cache space. We don't normally evict such blocks
|
|
// because replacing them requires a seek, but we need to make sure
|
|
// they don't monopolize the cache.
|
|
static const double NONSEEKABLE_READAHEAD_MAX = 0.5;
|
|
|
|
// Data N seconds before the current playback position is given the same priority
|
|
// as data REPLAY_PENALTY_FACTOR*N seconds ahead of the current playback
|
|
// position. REPLAY_PENALTY_FACTOR is greater than 1 to reflect that
|
|
// data in the past is less likely to be played again than data in the future.
|
|
// We want to give data just behind the current playback position reasonably
|
|
// high priority in case codecs need to retrieve that data (e.g. because
|
|
// tracks haven't been muxed well or are being decoded at uneven rates).
|
|
// 1/REPLAY_PENALTY_FACTOR as much data will be kept behind the
|
|
// current playback position as will be kept ahead of the current playback
|
|
// position.
|
|
static const uint32_t REPLAY_PENALTY_FACTOR = 3;
|
|
|
|
// When looking for a reusable block, scan forward this many blocks
|
|
// from the desired "best" block location to look for free blocks,
|
|
// before we resort to scanning the whole cache. The idea is to try to
|
|
// store runs of stream blocks close-to-consecutively in the cache if we
|
|
// can.
|
|
static const uint32_t FREE_BLOCK_SCAN_LIMIT = 16;
|
|
|
|
#ifdef DEBUG
|
|
// Turn this on to do very expensive cache state validation
|
|
// #define DEBUG_VERIFY_CACHE
|
|
#endif
|
|
|
|
// There is at most one media cache (although that could quite easily be
|
|
// relaxed if we wanted to manage multiple caches with independent
|
|
// size limits).
|
|
static MediaCache* gMediaCache;
|
|
|
|
class MediaCacheFlusher MOZ_FINAL : public nsIObserver,
|
|
public nsSupportsWeakReference {
|
|
MediaCacheFlusher() {}
|
|
~MediaCacheFlusher();
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSIOBSERVER
|
|
|
|
static void Init();
|
|
};
|
|
|
|
static MediaCacheFlusher* gMediaCacheFlusher;
|
|
|
|
NS_IMPL_ISUPPORTS(MediaCacheFlusher, nsIObserver, nsISupportsWeakReference)
|
|
|
|
MediaCacheFlusher::~MediaCacheFlusher()
|
|
{
|
|
gMediaCacheFlusher = nullptr;
|
|
}
|
|
|
|
void MediaCacheFlusher::Init()
|
|
{
|
|
if (gMediaCacheFlusher) {
|
|
return;
|
|
}
|
|
|
|
gMediaCacheFlusher = new MediaCacheFlusher();
|
|
NS_ADDREF(gMediaCacheFlusher);
|
|
|
|
nsCOMPtr<nsIObserverService> observerService =
|
|
mozilla::services::GetObserverService();
|
|
if (observerService) {
|
|
observerService->AddObserver(gMediaCacheFlusher, "last-pb-context-exited", true);
|
|
observerService->AddObserver(gMediaCacheFlusher, "network-clear-cache-stored-anywhere", true);
|
|
}
|
|
}
|
|
|
|
class MediaCache {
|
|
public:
|
|
friend class MediaCacheStream::BlockList;
|
|
typedef MediaCacheStream::BlockList BlockList;
|
|
enum {
|
|
BLOCK_SIZE = MediaCacheStream::BLOCK_SIZE
|
|
};
|
|
|
|
MediaCache() : mNextResourceID(1),
|
|
mReentrantMonitor("MediaCache.mReentrantMonitor"),
|
|
mUpdateQueued(false)
|
|
#ifdef DEBUG
|
|
, mInUpdate(false)
|
|
#endif
|
|
{
|
|
MOZ_COUNT_CTOR(MediaCache);
|
|
}
|
|
~MediaCache() {
|
|
NS_ASSERTION(mStreams.IsEmpty(), "Stream(s) still open!");
|
|
Truncate();
|
|
NS_ASSERTION(mIndex.Length() == 0, "Blocks leaked?");
|
|
if (mFileCache) {
|
|
mFileCache->Close();
|
|
mFileCache = nullptr;
|
|
}
|
|
MOZ_COUNT_DTOR(MediaCache);
|
|
}
|
|
|
|
// Main thread only. Creates the backing cache file. If this fails,
|
|
// then the cache is still in a semi-valid state; mFD will be null,
|
|
// so all I/O on the cache file will fail.
|
|
nsresult Init();
|
|
// Shut down the global cache if it's no longer needed. We shut down
|
|
// the cache as soon as there are no streams. This means that during
|
|
// normal operation we are likely to start up the cache and shut it down
|
|
// many times, but that's OK since starting it up is cheap and
|
|
// shutting it down cleans things up and releases disk space.
|
|
static void MaybeShutdown();
|
|
|
|
// Brutally flush the cache contents. Main thread only.
|
|
static void Flush();
|
|
void FlushInternal();
|
|
|
|
// Cache-file access methods. These are the lowest-level cache methods.
|
|
// mReentrantMonitor must be held; these can be called on any thread.
|
|
// This can return partial reads.
|
|
nsresult ReadCacheFile(int64_t aOffset, void* aData, int32_t aLength,
|
|
int32_t* aBytes);
|
|
// This will fail if all aLength bytes are not read
|
|
nsresult ReadCacheFileAllBytes(int64_t aOffset, void* aData, int32_t aLength);
|
|
|
|
int64_t AllocateResourceID()
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
return mNextResourceID++;
|
|
}
|
|
|
|
// mReentrantMonitor must be held, called on main thread.
|
|
// These methods are used by the stream to set up and tear down streams,
|
|
// and to handle reads and writes.
|
|
// Add aStream to the list of streams.
|
|
void OpenStream(MediaCacheStream* aStream);
|
|
// Remove aStream from the list of streams.
|
|
void ReleaseStream(MediaCacheStream* aStream);
|
|
// Free all blocks belonging to aStream.
|
|
void ReleaseStreamBlocks(MediaCacheStream* aStream);
|
|
// Find a cache entry for this data, and write the data into it
|
|
void AllocateAndWriteBlock(MediaCacheStream* aStream, const void* aData,
|
|
MediaCacheStream::ReadMode aMode);
|
|
|
|
// mReentrantMonitor must be held; can be called on any thread
|
|
// Notify the cache that a seek has been requested. Some blocks may
|
|
// need to change their class between PLAYED_BLOCK and READAHEAD_BLOCK.
|
|
// This does not trigger channel seeks directly, the next Update()
|
|
// will do that if necessary. The caller will call QueueUpdate().
|
|
void NoteSeek(MediaCacheStream* aStream, int64_t aOldOffset);
|
|
// Notify the cache that a block has been read from. This is used
|
|
// to update last-use times. The block may not actually have a
|
|
// cache entry yet since Read can read data from a stream's
|
|
// in-memory mPartialBlockBuffer while the block is only partly full,
|
|
// and thus hasn't yet been committed to the cache. The caller will
|
|
// call QueueUpdate().
|
|
void NoteBlockUsage(MediaCacheStream* aStream, int32_t aBlockIndex,
|
|
MediaCacheStream::ReadMode aMode, TimeStamp aNow);
|
|
// Mark aStream as having the block, adding it as an owner.
|
|
void AddBlockOwnerAsReadahead(int32_t aBlockIndex, MediaCacheStream* aStream,
|
|
int32_t aStreamBlockIndex);
|
|
|
|
// This queues a call to Update() on the main thread.
|
|
void QueueUpdate();
|
|
|
|
// Updates the cache state asynchronously on the main thread:
|
|
// -- try to trim the cache back to its desired size, if necessary
|
|
// -- suspend channels that are going to read data that's lower priority
|
|
// than anything currently cached
|
|
// -- resume channels that are going to read data that's higher priority
|
|
// than something currently cached
|
|
// -- seek channels that need to seek to a new location
|
|
void Update();
|
|
|
|
#ifdef DEBUG_VERIFY_CACHE
|
|
// Verify invariants, especially block list invariants
|
|
void Verify();
|
|
#else
|
|
void Verify() {}
|
|
#endif
|
|
|
|
ReentrantMonitor& GetReentrantMonitor() { return mReentrantMonitor; }
|
|
|
|
/**
|
|
* An iterator that makes it easy to iterate through all streams that
|
|
* have a given resource ID and are not closed.
|
|
* Can be used on the main thread or while holding the media cache lock.
|
|
*/
|
|
class ResourceStreamIterator {
|
|
public:
|
|
explicit ResourceStreamIterator(int64_t aResourceID) :
|
|
mResourceID(aResourceID), mNext(0) {}
|
|
MediaCacheStream* Next()
|
|
{
|
|
while (mNext < gMediaCache->mStreams.Length()) {
|
|
MediaCacheStream* stream = gMediaCache->mStreams[mNext];
|
|
++mNext;
|
|
if (stream->GetResourceID() == mResourceID && !stream->IsClosed())
|
|
return stream;
|
|
}
|
|
return nullptr;
|
|
}
|
|
private:
|
|
int64_t mResourceID;
|
|
uint32_t mNext;
|
|
};
|
|
|
|
protected:
|
|
// Find a free or reusable block and return its index. If there are no
|
|
// free blocks and no reusable blocks, add a new block to the cache
|
|
// and return it. Can return -1 on OOM.
|
|
int32_t FindBlockForIncomingData(TimeStamp aNow, MediaCacheStream* aStream);
|
|
// Find a reusable block --- a free block, if there is one, otherwise
|
|
// the reusable block with the latest predicted-next-use, or -1 if
|
|
// there aren't any freeable blocks. Only block indices less than
|
|
// aMaxSearchBlockIndex are considered. If aForStream is non-null,
|
|
// then aForStream and aForStreamBlock indicate what media data will
|
|
// be placed; FindReusableBlock will favour returning free blocks
|
|
// near other blocks for that point in the stream.
|
|
int32_t FindReusableBlock(TimeStamp aNow,
|
|
MediaCacheStream* aForStream,
|
|
int32_t aForStreamBlock,
|
|
int32_t aMaxSearchBlockIndex);
|
|
bool BlockIsReusable(int32_t aBlockIndex);
|
|
// Given a list of blocks sorted with the most reusable blocks at the
|
|
// end, find the last block whose stream is not pinned (if any)
|
|
// and whose cache entry index is less than aBlockIndexLimit
|
|
// and append it to aResult.
|
|
void AppendMostReusableBlock(BlockList* aBlockList,
|
|
nsTArray<uint32_t>* aResult,
|
|
int32_t aBlockIndexLimit);
|
|
|
|
enum BlockClass {
|
|
// block belongs to mMetadataBlockList because data has been consumed
|
|
// from it in "metadata mode" --- in particular blocks read during
|
|
// Ogg seeks go into this class. These blocks may have played data
|
|
// in them too.
|
|
METADATA_BLOCK,
|
|
// block belongs to mPlayedBlockList because its offset is
|
|
// less than the stream's current reader position
|
|
PLAYED_BLOCK,
|
|
// block belongs to the stream's mReadaheadBlockList because its
|
|
// offset is greater than or equal to the stream's current
|
|
// reader position
|
|
READAHEAD_BLOCK
|
|
};
|
|
|
|
struct BlockOwner {
|
|
BlockOwner() : mStream(nullptr), mClass(READAHEAD_BLOCK) {}
|
|
|
|
// The stream that owns this block, or null if the block is free.
|
|
MediaCacheStream* mStream;
|
|
// The block index in the stream. Valid only if mStream is non-null.
|
|
uint32_t mStreamBlock;
|
|
// Time at which this block was last used. Valid only if
|
|
// mClass is METADATA_BLOCK or PLAYED_BLOCK.
|
|
TimeStamp mLastUseTime;
|
|
BlockClass mClass;
|
|
};
|
|
|
|
struct Block {
|
|
// Free blocks have an empty mOwners array
|
|
nsTArray<BlockOwner> mOwners;
|
|
};
|
|
|
|
// Get the BlockList that the block should belong to given its
|
|
// current owner
|
|
BlockList* GetListForBlock(BlockOwner* aBlock);
|
|
// Get the BlockOwner for the given block index and owning stream
|
|
// (returns null if the stream does not own the block)
|
|
BlockOwner* GetBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream);
|
|
// Returns true iff the block is free
|
|
bool IsBlockFree(int32_t aBlockIndex)
|
|
{ return mIndex[aBlockIndex].mOwners.IsEmpty(); }
|
|
// Add the block to the free list and mark its streams as not having
|
|
// the block in cache
|
|
void FreeBlock(int32_t aBlock);
|
|
// Mark aStream as not having the block, removing it as an owner. If
|
|
// the block has no more owners it's added to the free list.
|
|
void RemoveBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream);
|
|
// Swap all metadata associated with the two blocks. The caller
|
|
// is responsible for swapping up any cache file state.
|
|
void SwapBlocks(int32_t aBlockIndex1, int32_t aBlockIndex2);
|
|
// Insert the block into the readahead block list for the stream
|
|
// at the right point in the list.
|
|
void InsertReadaheadBlock(BlockOwner* aBlockOwner, int32_t aBlockIndex);
|
|
|
|
// Guess the duration until block aBlock will be next used
|
|
TimeDuration PredictNextUse(TimeStamp aNow, int32_t aBlock);
|
|
// Guess the duration until the next incoming data on aStream will be used
|
|
TimeDuration PredictNextUseForIncomingData(MediaCacheStream* aStream);
|
|
|
|
// Truncate the file and index array if there are free blocks at the
|
|
// end
|
|
void Truncate();
|
|
|
|
// This member is main-thread only. It's used to allocate unique
|
|
// resource IDs to streams.
|
|
int64_t mNextResourceID;
|
|
|
|
// The monitor protects all the data members here. Also, off-main-thread
|
|
// readers that need to block will Wait() on this monitor. When new
|
|
// data becomes available in the cache, we NotifyAll() on this monitor.
|
|
ReentrantMonitor mReentrantMonitor;
|
|
// This is only written while on the main thread and the monitor is held.
|
|
// Thus, it can be safely read from the main thread or while holding the monitor.
|
|
nsTArray<MediaCacheStream*> mStreams;
|
|
// The Blocks describing the cache entries.
|
|
nsTArray<Block> mIndex;
|
|
// Writer which performs IO, asynchronously writing cache blocks.
|
|
nsRefPtr<FileBlockCache> mFileCache;
|
|
// The list of free blocks; they are not ordered.
|
|
BlockList mFreeBlocks;
|
|
// True if an event to run Update() has been queued but not processed
|
|
bool mUpdateQueued;
|
|
#ifdef DEBUG
|
|
bool mInUpdate;
|
|
#endif
|
|
};
|
|
|
|
NS_IMETHODIMP
|
|
MediaCacheFlusher::Observe(nsISupports *aSubject, char const *aTopic, char16_t const *aData)
|
|
{
|
|
if (strcmp(aTopic, "last-pb-context-exited") == 0) {
|
|
MediaCache::Flush();
|
|
}
|
|
if (strcmp(aTopic, "network-clear-cache-stored-anywhere") == 0) {
|
|
MediaCache::Flush();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
MediaCacheStream::MediaCacheStream(ChannelMediaResource* aClient)
|
|
: mClient(aClient),
|
|
mInitialized(false),
|
|
mHasHadUpdate(false),
|
|
mClosed(false),
|
|
mDidNotifyDataEnded(false),
|
|
mResourceID(0),
|
|
mIsTransportSeekable(false),
|
|
mCacheSuspended(false),
|
|
mChannelEnded(false),
|
|
mChannelOffset(0),
|
|
mStreamLength(-1),
|
|
mStreamOffset(0),
|
|
mPlaybackBytesPerSecond(10000),
|
|
mPinCount(0),
|
|
mCurrentMode(MODE_PLAYBACK),
|
|
mMetadataInPartialBlockBuffer(false),
|
|
mPartialBlockBuffer(new int64_t[BLOCK_SIZE/sizeof(int64_t)])
|
|
{
|
|
}
|
|
|
|
size_t MediaCacheStream::SizeOfExcludingThis(
|
|
MallocSizeOf aMallocSizeOf) const
|
|
{
|
|
// Looks like these are not owned:
|
|
// - mClient
|
|
// - mPrincipal
|
|
size_t size = mBlocks.SizeOfExcludingThis(aMallocSizeOf);
|
|
size += mReadaheadBlocks.SizeOfExcludingThis(aMallocSizeOf);
|
|
size += mMetadataBlocks.SizeOfExcludingThis(aMallocSizeOf);
|
|
size += mPlayedBlocks.SizeOfExcludingThis(aMallocSizeOf);
|
|
size += mPartialBlockBuffer.SizeOfExcludingThis(aMallocSizeOf);
|
|
|
|
return size;
|
|
}
|
|
|
|
size_t MediaCacheStream::BlockList::SizeOfExcludingThis(
|
|
MallocSizeOf aMallocSizeOf) const
|
|
{
|
|
return mEntries.SizeOfExcludingThis(/* sizeOfEntryExcludingThis = */ nullptr,
|
|
aMallocSizeOf);
|
|
}
|
|
|
|
void MediaCacheStream::BlockList::AddFirstBlock(int32_t aBlock)
|
|
{
|
|
NS_ASSERTION(!mEntries.GetEntry(aBlock), "Block already in list");
|
|
Entry* entry = mEntries.PutEntry(aBlock);
|
|
|
|
if (mFirstBlock < 0) {
|
|
entry->mNextBlock = entry->mPrevBlock = aBlock;
|
|
} else {
|
|
entry->mNextBlock = mFirstBlock;
|
|
entry->mPrevBlock = mEntries.GetEntry(mFirstBlock)->mPrevBlock;
|
|
mEntries.GetEntry(entry->mNextBlock)->mPrevBlock = aBlock;
|
|
mEntries.GetEntry(entry->mPrevBlock)->mNextBlock = aBlock;
|
|
}
|
|
mFirstBlock = aBlock;
|
|
++mCount;
|
|
}
|
|
|
|
void MediaCacheStream::BlockList::AddAfter(int32_t aBlock, int32_t aBefore)
|
|
{
|
|
NS_ASSERTION(!mEntries.GetEntry(aBlock), "Block already in list");
|
|
Entry* entry = mEntries.PutEntry(aBlock);
|
|
|
|
Entry* addAfter = mEntries.GetEntry(aBefore);
|
|
NS_ASSERTION(addAfter, "aBefore not in list");
|
|
|
|
entry->mNextBlock = addAfter->mNextBlock;
|
|
entry->mPrevBlock = aBefore;
|
|
mEntries.GetEntry(entry->mNextBlock)->mPrevBlock = aBlock;
|
|
mEntries.GetEntry(entry->mPrevBlock)->mNextBlock = aBlock;
|
|
++mCount;
|
|
}
|
|
|
|
void MediaCacheStream::BlockList::RemoveBlock(int32_t aBlock)
|
|
{
|
|
Entry* entry = mEntries.GetEntry(aBlock);
|
|
NS_ASSERTION(entry, "Block not in list");
|
|
|
|
if (entry->mNextBlock == aBlock) {
|
|
NS_ASSERTION(entry->mPrevBlock == aBlock, "Linked list inconsistency");
|
|
NS_ASSERTION(mFirstBlock == aBlock, "Linked list inconsistency");
|
|
mFirstBlock = -1;
|
|
} else {
|
|
if (mFirstBlock == aBlock) {
|
|
mFirstBlock = entry->mNextBlock;
|
|
}
|
|
mEntries.GetEntry(entry->mNextBlock)->mPrevBlock = entry->mPrevBlock;
|
|
mEntries.GetEntry(entry->mPrevBlock)->mNextBlock = entry->mNextBlock;
|
|
}
|
|
mEntries.RemoveEntry(aBlock);
|
|
--mCount;
|
|
}
|
|
|
|
int32_t MediaCacheStream::BlockList::GetLastBlock() const
|
|
{
|
|
if (mFirstBlock < 0)
|
|
return -1;
|
|
return mEntries.GetEntry(mFirstBlock)->mPrevBlock;
|
|
}
|
|
|
|
int32_t MediaCacheStream::BlockList::GetNextBlock(int32_t aBlock) const
|
|
{
|
|
int32_t block = mEntries.GetEntry(aBlock)->mNextBlock;
|
|
if (block == mFirstBlock)
|
|
return -1;
|
|
return block;
|
|
}
|
|
|
|
int32_t MediaCacheStream::BlockList::GetPrevBlock(int32_t aBlock) const
|
|
{
|
|
if (aBlock == mFirstBlock)
|
|
return -1;
|
|
return mEntries.GetEntry(aBlock)->mPrevBlock;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
void MediaCacheStream::BlockList::Verify()
|
|
{
|
|
int32_t count = 0;
|
|
if (mFirstBlock >= 0) {
|
|
int32_t block = mFirstBlock;
|
|
do {
|
|
Entry* entry = mEntries.GetEntry(block);
|
|
NS_ASSERTION(mEntries.GetEntry(entry->mNextBlock)->mPrevBlock == block,
|
|
"Bad prev link");
|
|
NS_ASSERTION(mEntries.GetEntry(entry->mPrevBlock)->mNextBlock == block,
|
|
"Bad next link");
|
|
block = entry->mNextBlock;
|
|
++count;
|
|
} while (block != mFirstBlock);
|
|
}
|
|
NS_ASSERTION(count == mCount, "Bad count");
|
|
}
|
|
#endif
|
|
|
|
static void UpdateSwappedBlockIndex(int32_t* aBlockIndex,
|
|
int32_t aBlock1Index, int32_t aBlock2Index)
|
|
{
|
|
int32_t index = *aBlockIndex;
|
|
if (index == aBlock1Index) {
|
|
*aBlockIndex = aBlock2Index;
|
|
} else if (index == aBlock2Index) {
|
|
*aBlockIndex = aBlock1Index;
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::BlockList::NotifyBlockSwapped(int32_t aBlockIndex1,
|
|
int32_t aBlockIndex2)
|
|
{
|
|
Entry* e1 = mEntries.GetEntry(aBlockIndex1);
|
|
Entry* e2 = mEntries.GetEntry(aBlockIndex2);
|
|
int32_t e1Prev = -1, e1Next = -1, e2Prev = -1, e2Next = -1;
|
|
|
|
// Fix mFirstBlock
|
|
UpdateSwappedBlockIndex(&mFirstBlock, aBlockIndex1, aBlockIndex2);
|
|
|
|
// Fix mNextBlock/mPrevBlock links. First capture previous/next links
|
|
// so we don't get confused due to aliasing.
|
|
if (e1) {
|
|
e1Prev = e1->mPrevBlock;
|
|
e1Next = e1->mNextBlock;
|
|
}
|
|
if (e2) {
|
|
e2Prev = e2->mPrevBlock;
|
|
e2Next = e2->mNextBlock;
|
|
}
|
|
// Update the entries.
|
|
if (e1) {
|
|
mEntries.GetEntry(e1Prev)->mNextBlock = aBlockIndex2;
|
|
mEntries.GetEntry(e1Next)->mPrevBlock = aBlockIndex2;
|
|
}
|
|
if (e2) {
|
|
mEntries.GetEntry(e2Prev)->mNextBlock = aBlockIndex1;
|
|
mEntries.GetEntry(e2Next)->mPrevBlock = aBlockIndex1;
|
|
}
|
|
|
|
// Fix hashtable keys. First remove stale entries.
|
|
if (e1) {
|
|
e1Prev = e1->mPrevBlock;
|
|
e1Next = e1->mNextBlock;
|
|
mEntries.RemoveEntry(aBlockIndex1);
|
|
// Refresh pointer after hashtable mutation.
|
|
e2 = mEntries.GetEntry(aBlockIndex2);
|
|
}
|
|
if (e2) {
|
|
e2Prev = e2->mPrevBlock;
|
|
e2Next = e2->mNextBlock;
|
|
mEntries.RemoveEntry(aBlockIndex2);
|
|
}
|
|
// Put new entries back.
|
|
if (e1) {
|
|
e1 = mEntries.PutEntry(aBlockIndex2);
|
|
e1->mNextBlock = e1Next;
|
|
e1->mPrevBlock = e1Prev;
|
|
}
|
|
if (e2) {
|
|
e2 = mEntries.PutEntry(aBlockIndex1);
|
|
e2->mNextBlock = e2Next;
|
|
e2->mPrevBlock = e2Prev;
|
|
}
|
|
}
|
|
|
|
nsresult
|
|
MediaCache::Init()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
NS_ASSERTION(!mFileCache, "Cache file already open?");
|
|
|
|
PRFileDesc* fileDesc = nullptr;
|
|
nsresult rv = NS_OpenAnonymousTemporaryFile(&fileDesc);
|
|
NS_ENSURE_SUCCESS(rv,rv);
|
|
|
|
mFileCache = new FileBlockCache();
|
|
rv = mFileCache->Open(fileDesc);
|
|
NS_ENSURE_SUCCESS(rv,rv);
|
|
|
|
#ifdef PR_LOGGING
|
|
if (!gMediaCacheLog) {
|
|
gMediaCacheLog = PR_NewLogModule("MediaCache");
|
|
}
|
|
#endif
|
|
|
|
MediaCacheFlusher::Init();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
MediaCache::Flush()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
if (!gMediaCache)
|
|
return;
|
|
|
|
gMediaCache->FlushInternal();
|
|
}
|
|
|
|
void
|
|
MediaCache::FlushInternal()
|
|
{
|
|
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
|
|
|
for (uint32_t blockIndex = 0; blockIndex < mIndex.Length(); ++blockIndex) {
|
|
FreeBlock(blockIndex);
|
|
}
|
|
|
|
// Truncate file, close it, and reopen
|
|
Truncate();
|
|
NS_ASSERTION(mIndex.Length() == 0, "Blocks leaked?");
|
|
if (mFileCache) {
|
|
mFileCache->Close();
|
|
mFileCache = nullptr;
|
|
}
|
|
Init();
|
|
}
|
|
|
|
void
|
|
MediaCache::MaybeShutdown()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(),
|
|
"MediaCache::MaybeShutdown called on non-main thread");
|
|
if (!gMediaCache->mStreams.IsEmpty()) {
|
|
// Don't shut down yet, streams are still alive
|
|
return;
|
|
}
|
|
|
|
// Since we're on the main thread, no-one is going to add a new stream
|
|
// while we shut down.
|
|
// This function is static so we don't have to delete 'this'.
|
|
delete gMediaCache;
|
|
gMediaCache = nullptr;
|
|
NS_IF_RELEASE(gMediaCacheFlusher);
|
|
}
|
|
|
|
static void
|
|
InitMediaCache()
|
|
{
|
|
if (gMediaCache)
|
|
return;
|
|
|
|
gMediaCache = new MediaCache();
|
|
if (!gMediaCache)
|
|
return;
|
|
|
|
nsresult rv = gMediaCache->Init();
|
|
if (NS_FAILED(rv)) {
|
|
delete gMediaCache;
|
|
gMediaCache = nullptr;
|
|
}
|
|
}
|
|
|
|
nsresult
|
|
MediaCache::ReadCacheFile(int64_t aOffset, void* aData, int32_t aLength,
|
|
int32_t* aBytes)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
if (!mFileCache)
|
|
return NS_ERROR_FAILURE;
|
|
|
|
return mFileCache->Read(aOffset, reinterpret_cast<uint8_t*>(aData), aLength, aBytes);
|
|
}
|
|
|
|
nsresult
|
|
MediaCache::ReadCacheFileAllBytes(int64_t aOffset, void* aData, int32_t aLength)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
int64_t offset = aOffset;
|
|
int32_t count = aLength;
|
|
// Cast to char* so we can do byte-wise pointer arithmetic
|
|
char* data = static_cast<char*>(aData);
|
|
while (count > 0) {
|
|
int32_t bytes;
|
|
nsresult rv = ReadCacheFile(offset, data, count, &bytes);
|
|
if (NS_FAILED(rv))
|
|
return rv;
|
|
if (bytes == 0)
|
|
return NS_ERROR_FAILURE;
|
|
count -= bytes;
|
|
data += bytes;
|
|
offset += bytes;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
static int32_t GetMaxBlocks()
|
|
{
|
|
// We look up the cache size every time. This means dynamic changes
|
|
// to the pref are applied.
|
|
// Cache size is in KB
|
|
int32_t cacheSize = Preferences::GetInt("media.cache_size", 500*1024);
|
|
int64_t maxBlocks = static_cast<int64_t>(cacheSize)*1024/MediaCache::BLOCK_SIZE;
|
|
maxBlocks = std::max<int64_t>(maxBlocks, 1);
|
|
return int32_t(std::min<int64_t>(maxBlocks, INT32_MAX));
|
|
}
|
|
|
|
int32_t
|
|
MediaCache::FindBlockForIncomingData(TimeStamp aNow,
|
|
MediaCacheStream* aStream)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
int32_t blockIndex = FindReusableBlock(aNow, aStream,
|
|
aStream->mChannelOffset/BLOCK_SIZE, INT32_MAX);
|
|
|
|
if (blockIndex < 0 || !IsBlockFree(blockIndex)) {
|
|
// The block returned is already allocated.
|
|
// Don't reuse it if a) there's room to expand the cache or
|
|
// b) the data we're going to store in the free block is not higher
|
|
// priority than the data already stored in the free block.
|
|
// The latter can lead us to go over the cache limit a bit.
|
|
if ((mIndex.Length() < uint32_t(GetMaxBlocks()) || blockIndex < 0 ||
|
|
PredictNextUseForIncomingData(aStream) >= PredictNextUse(aNow, blockIndex))) {
|
|
blockIndex = mIndex.Length();
|
|
if (!mIndex.AppendElement())
|
|
return -1;
|
|
mFreeBlocks.AddFirstBlock(blockIndex);
|
|
return blockIndex;
|
|
}
|
|
}
|
|
|
|
return blockIndex;
|
|
}
|
|
|
|
bool
|
|
MediaCache::BlockIsReusable(int32_t aBlockIndex)
|
|
{
|
|
Block* block = &mIndex[aBlockIndex];
|
|
for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
|
|
MediaCacheStream* stream = block->mOwners[i].mStream;
|
|
if (stream->mPinCount > 0 ||
|
|
stream->mStreamOffset/BLOCK_SIZE == block->mOwners[i].mStreamBlock) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void
|
|
MediaCache::AppendMostReusableBlock(BlockList* aBlockList,
|
|
nsTArray<uint32_t>* aResult,
|
|
int32_t aBlockIndexLimit)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
int32_t blockIndex = aBlockList->GetLastBlock();
|
|
if (blockIndex < 0)
|
|
return;
|
|
do {
|
|
// Don't consider blocks for pinned streams, or blocks that are
|
|
// beyond the specified limit, or a block that contains a stream's
|
|
// current read position (such a block contains both played data
|
|
// and readahead data)
|
|
if (blockIndex < aBlockIndexLimit && BlockIsReusable(blockIndex)) {
|
|
aResult->AppendElement(blockIndex);
|
|
return;
|
|
}
|
|
blockIndex = aBlockList->GetPrevBlock(blockIndex);
|
|
} while (blockIndex >= 0);
|
|
}
|
|
|
|
int32_t
|
|
MediaCache::FindReusableBlock(TimeStamp aNow,
|
|
MediaCacheStream* aForStream,
|
|
int32_t aForStreamBlock,
|
|
int32_t aMaxSearchBlockIndex)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
uint32_t length = std::min(uint32_t(aMaxSearchBlockIndex), uint32_t(mIndex.Length()));
|
|
|
|
if (aForStream && aForStreamBlock > 0 &&
|
|
uint32_t(aForStreamBlock) <= aForStream->mBlocks.Length()) {
|
|
int32_t prevCacheBlock = aForStream->mBlocks[aForStreamBlock - 1];
|
|
if (prevCacheBlock >= 0) {
|
|
uint32_t freeBlockScanEnd =
|
|
std::min(length, prevCacheBlock + FREE_BLOCK_SCAN_LIMIT);
|
|
for (uint32_t i = prevCacheBlock; i < freeBlockScanEnd; ++i) {
|
|
if (IsBlockFree(i))
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!mFreeBlocks.IsEmpty()) {
|
|
int32_t blockIndex = mFreeBlocks.GetFirstBlock();
|
|
do {
|
|
if (blockIndex < aMaxSearchBlockIndex)
|
|
return blockIndex;
|
|
blockIndex = mFreeBlocks.GetNextBlock(blockIndex);
|
|
} while (blockIndex >= 0);
|
|
}
|
|
|
|
// Build a list of the blocks we should consider for the "latest
|
|
// predicted time of next use". We can exploit the fact that the block
|
|
// linked lists are ordered by increasing time of next use. This is
|
|
// actually the whole point of having the linked lists.
|
|
nsAutoTArray<uint32_t,8> candidates;
|
|
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
|
MediaCacheStream* stream = mStreams[i];
|
|
if (stream->mPinCount > 0) {
|
|
// No point in even looking at this stream's blocks
|
|
continue;
|
|
}
|
|
|
|
AppendMostReusableBlock(&stream->mMetadataBlocks, &candidates, length);
|
|
AppendMostReusableBlock(&stream->mPlayedBlocks, &candidates, length);
|
|
|
|
// Don't consider readahead blocks in non-seekable streams. If we
|
|
// remove the block we won't be able to seek back to read it later.
|
|
if (stream->mIsTransportSeekable) {
|
|
AppendMostReusableBlock(&stream->mReadaheadBlocks, &candidates, length);
|
|
}
|
|
}
|
|
|
|
TimeDuration latestUse;
|
|
int32_t latestUseBlock = -1;
|
|
for (uint32_t i = 0; i < candidates.Length(); ++i) {
|
|
TimeDuration nextUse = PredictNextUse(aNow, candidates[i]);
|
|
if (nextUse > latestUse) {
|
|
latestUse = nextUse;
|
|
latestUseBlock = candidates[i];
|
|
}
|
|
}
|
|
|
|
return latestUseBlock;
|
|
}
|
|
|
|
MediaCache::BlockList*
|
|
MediaCache::GetListForBlock(BlockOwner* aBlock)
|
|
{
|
|
switch (aBlock->mClass) {
|
|
case METADATA_BLOCK:
|
|
NS_ASSERTION(aBlock->mStream, "Metadata block has no stream?");
|
|
return &aBlock->mStream->mMetadataBlocks;
|
|
case PLAYED_BLOCK:
|
|
NS_ASSERTION(aBlock->mStream, "Metadata block has no stream?");
|
|
return &aBlock->mStream->mPlayedBlocks;
|
|
case READAHEAD_BLOCK:
|
|
NS_ASSERTION(aBlock->mStream, "Readahead block has no stream?");
|
|
return &aBlock->mStream->mReadaheadBlocks;
|
|
default:
|
|
NS_ERROR("Invalid block class");
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
MediaCache::BlockOwner*
|
|
MediaCache::GetBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream)
|
|
{
|
|
Block* block = &mIndex[aBlockIndex];
|
|
for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
|
|
if (block->mOwners[i].mStream == aStream)
|
|
return &block->mOwners[i];
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
void
|
|
MediaCache::SwapBlocks(int32_t aBlockIndex1, int32_t aBlockIndex2)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
Block* block1 = &mIndex[aBlockIndex1];
|
|
Block* block2 = &mIndex[aBlockIndex2];
|
|
|
|
block1->mOwners.SwapElements(block2->mOwners);
|
|
|
|
// Now all references to block1 have to be replaced with block2 and
|
|
// vice versa.
|
|
// First update stream references to blocks via mBlocks.
|
|
const Block* blocks[] = { block1, block2 };
|
|
int32_t blockIndices[] = { aBlockIndex1, aBlockIndex2 };
|
|
for (int32_t i = 0; i < 2; ++i) {
|
|
for (uint32_t j = 0; j < blocks[i]->mOwners.Length(); ++j) {
|
|
const BlockOwner* b = &blocks[i]->mOwners[j];
|
|
b->mStream->mBlocks[b->mStreamBlock] = blockIndices[i];
|
|
}
|
|
}
|
|
|
|
// Now update references to blocks in block lists.
|
|
mFreeBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
|
|
|
|
nsTHashtable<nsPtrHashKey<MediaCacheStream> > visitedStreams;
|
|
|
|
for (int32_t i = 0; i < 2; ++i) {
|
|
for (uint32_t j = 0; j < blocks[i]->mOwners.Length(); ++j) {
|
|
MediaCacheStream* stream = blocks[i]->mOwners[j].mStream;
|
|
// Make sure that we don't update the same stream twice --- that
|
|
// would result in swapping the block references back again!
|
|
if (visitedStreams.GetEntry(stream))
|
|
continue;
|
|
visitedStreams.PutEntry(stream);
|
|
stream->mReadaheadBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
|
|
stream->mPlayedBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
|
|
stream->mMetadataBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
|
|
}
|
|
}
|
|
|
|
Verify();
|
|
}
|
|
|
|
void
|
|
MediaCache::RemoveBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream)
|
|
{
|
|
Block* block = &mIndex[aBlockIndex];
|
|
for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
|
|
BlockOwner* bo = &block->mOwners[i];
|
|
if (bo->mStream == aStream) {
|
|
GetListForBlock(bo)->RemoveBlock(aBlockIndex);
|
|
bo->mStream->mBlocks[bo->mStreamBlock] = -1;
|
|
block->mOwners.RemoveElementAt(i);
|
|
if (block->mOwners.IsEmpty()) {
|
|
mFreeBlocks.AddFirstBlock(aBlockIndex);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCache::AddBlockOwnerAsReadahead(int32_t aBlockIndex,
|
|
MediaCacheStream* aStream,
|
|
int32_t aStreamBlockIndex)
|
|
{
|
|
Block* block = &mIndex[aBlockIndex];
|
|
if (block->mOwners.IsEmpty()) {
|
|
mFreeBlocks.RemoveBlock(aBlockIndex);
|
|
}
|
|
BlockOwner* bo = block->mOwners.AppendElement();
|
|
bo->mStream = aStream;
|
|
bo->mStreamBlock = aStreamBlockIndex;
|
|
aStream->mBlocks[aStreamBlockIndex] = aBlockIndex;
|
|
bo->mClass = READAHEAD_BLOCK;
|
|
InsertReadaheadBlock(bo, aBlockIndex);
|
|
}
|
|
|
|
void
|
|
MediaCache::FreeBlock(int32_t aBlock)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
Block* block = &mIndex[aBlock];
|
|
if (block->mOwners.IsEmpty()) {
|
|
// already free
|
|
return;
|
|
}
|
|
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Released block %d", aBlock));
|
|
|
|
for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
|
|
BlockOwner* bo = &block->mOwners[i];
|
|
GetListForBlock(bo)->RemoveBlock(aBlock);
|
|
bo->mStream->mBlocks[bo->mStreamBlock] = -1;
|
|
}
|
|
block->mOwners.Clear();
|
|
mFreeBlocks.AddFirstBlock(aBlock);
|
|
Verify();
|
|
}
|
|
|
|
TimeDuration
|
|
MediaCache::PredictNextUse(TimeStamp aNow, int32_t aBlock)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
NS_ASSERTION(!IsBlockFree(aBlock), "aBlock is free");
|
|
|
|
Block* block = &mIndex[aBlock];
|
|
// Blocks can be belong to multiple streams. The predicted next use
|
|
// time is the earliest time predicted by any of the streams.
|
|
TimeDuration result;
|
|
for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
|
|
BlockOwner* bo = &block->mOwners[i];
|
|
TimeDuration prediction;
|
|
switch (bo->mClass) {
|
|
case METADATA_BLOCK:
|
|
// This block should be managed in LRU mode. For metadata we predict
|
|
// that the time until the next use is the time since the last use.
|
|
prediction = aNow - bo->mLastUseTime;
|
|
break;
|
|
case PLAYED_BLOCK: {
|
|
// This block should be managed in LRU mode, and we should impose
|
|
// a "replay delay" to reflect the likelihood of replay happening
|
|
NS_ASSERTION(static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE <
|
|
bo->mStream->mStreamOffset,
|
|
"Played block after the current stream position?");
|
|
int64_t bytesBehind =
|
|
bo->mStream->mStreamOffset - static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE;
|
|
int64_t millisecondsBehind =
|
|
bytesBehind*1000/bo->mStream->mPlaybackBytesPerSecond;
|
|
prediction = TimeDuration::FromMilliseconds(
|
|
std::min<int64_t>(millisecondsBehind*REPLAY_PENALTY_FACTOR, INT32_MAX));
|
|
break;
|
|
}
|
|
case READAHEAD_BLOCK: {
|
|
int64_t bytesAhead =
|
|
static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE - bo->mStream->mStreamOffset;
|
|
NS_ASSERTION(bytesAhead >= 0,
|
|
"Readahead block before the current stream position?");
|
|
int64_t millisecondsAhead =
|
|
bytesAhead*1000/bo->mStream->mPlaybackBytesPerSecond;
|
|
prediction = TimeDuration::FromMilliseconds(
|
|
std::min<int64_t>(millisecondsAhead, INT32_MAX));
|
|
break;
|
|
}
|
|
default:
|
|
NS_ERROR("Invalid class for predicting next use");
|
|
return TimeDuration(0);
|
|
}
|
|
if (i == 0 || prediction < result) {
|
|
result = prediction;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
TimeDuration
|
|
MediaCache::PredictNextUseForIncomingData(MediaCacheStream* aStream)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
int64_t bytesAhead = aStream->mChannelOffset - aStream->mStreamOffset;
|
|
if (bytesAhead <= -BLOCK_SIZE) {
|
|
// Hmm, no idea when data behind us will be used. Guess 24 hours.
|
|
return TimeDuration::FromSeconds(24*60*60);
|
|
}
|
|
if (bytesAhead <= 0)
|
|
return TimeDuration(0);
|
|
int64_t millisecondsAhead = bytesAhead*1000/aStream->mPlaybackBytesPerSecond;
|
|
return TimeDuration::FromMilliseconds(
|
|
std::min<int64_t>(millisecondsAhead, INT32_MAX));
|
|
}
|
|
|
|
enum StreamAction { NONE, SEEK, SEEK_AND_RESUME, RESUME, SUSPEND };
|
|
|
|
void
|
|
MediaCache::Update()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
// The action to use for each stream. We store these so we can make
|
|
// decisions while holding the cache lock but implement those decisions
|
|
// without holding the cache lock, since we need to call out to
|
|
// stream, decoder and element code.
|
|
nsAutoTArray<StreamAction,10> actions;
|
|
|
|
{
|
|
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
|
mUpdateQueued = false;
|
|
#ifdef DEBUG
|
|
mInUpdate = true;
|
|
#endif
|
|
|
|
int32_t maxBlocks = GetMaxBlocks();
|
|
TimeStamp now = TimeStamp::Now();
|
|
|
|
int32_t freeBlockCount = mFreeBlocks.GetCount();
|
|
TimeDuration latestPredictedUseForOverflow = 0;
|
|
if (mIndex.Length() > uint32_t(maxBlocks)) {
|
|
// Try to trim back the cache to its desired maximum size. The cache may
|
|
// have overflowed simply due to data being received when we have
|
|
// no blocks in the main part of the cache that are free or lower
|
|
// priority than the new data. The cache can also be overflowing because
|
|
// the media.cache_size preference was reduced.
|
|
// First, figure out what the least valuable block in the cache overflow
|
|
// is. We don't want to replace any blocks in the main part of the
|
|
// cache whose expected time of next use is earlier or equal to that.
|
|
// If we allow that, we can effectively end up discarding overflowing
|
|
// blocks (by moving an overflowing block to the main part of the cache,
|
|
// and then overwriting it with another overflowing block), and we try
|
|
// to avoid that since it requires HTTP seeks.
|
|
// We also use this loop to eliminate overflowing blocks from
|
|
// freeBlockCount.
|
|
for (int32_t blockIndex = mIndex.Length() - 1; blockIndex >= maxBlocks;
|
|
--blockIndex) {
|
|
if (IsBlockFree(blockIndex)) {
|
|
// Don't count overflowing free blocks in our free block count
|
|
--freeBlockCount;
|
|
continue;
|
|
}
|
|
TimeDuration predictedUse = PredictNextUse(now, blockIndex);
|
|
latestPredictedUseForOverflow = std::max(latestPredictedUseForOverflow, predictedUse);
|
|
}
|
|
} else {
|
|
freeBlockCount += maxBlocks - mIndex.Length();
|
|
}
|
|
|
|
// Now try to move overflowing blocks to the main part of the cache.
|
|
for (int32_t blockIndex = mIndex.Length() - 1; blockIndex >= maxBlocks;
|
|
--blockIndex) {
|
|
if (IsBlockFree(blockIndex))
|
|
continue;
|
|
|
|
Block* block = &mIndex[blockIndex];
|
|
// Try to relocate the block close to other blocks for the first stream.
|
|
// There is no point in trying to make it close to other blocks in
|
|
// *all* the streams it might belong to.
|
|
int32_t destinationBlockIndex =
|
|
FindReusableBlock(now, block->mOwners[0].mStream,
|
|
block->mOwners[0].mStreamBlock, maxBlocks);
|
|
if (destinationBlockIndex < 0) {
|
|
// Nowhere to place this overflow block. We won't be able to
|
|
// place any more overflow blocks.
|
|
break;
|
|
}
|
|
|
|
if (IsBlockFree(destinationBlockIndex) ||
|
|
PredictNextUse(now, destinationBlockIndex) > latestPredictedUseForOverflow) {
|
|
// Reuse blocks in the main part of the cache that are less useful than
|
|
// the least useful overflow blocks
|
|
|
|
nsresult rv = mFileCache->MoveBlock(blockIndex, destinationBlockIndex);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
// We successfully copied the file data.
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Swapping blocks %d and %d (trimming cache)",
|
|
blockIndex, destinationBlockIndex));
|
|
// Swapping the block metadata here lets us maintain the
|
|
// correct positions in the linked lists
|
|
SwapBlocks(blockIndex, destinationBlockIndex);
|
|
//Free the overflowing block even if the copy failed.
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Released block %d (trimming cache)", blockIndex));
|
|
FreeBlock(blockIndex);
|
|
}
|
|
} else {
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Could not trim cache block %d (destination %d, predicted next use %f, latest predicted use for overflow %f",
|
|
blockIndex, destinationBlockIndex,
|
|
PredictNextUse(now, destinationBlockIndex).ToSeconds(),
|
|
latestPredictedUseForOverflow.ToSeconds()));
|
|
}
|
|
}
|
|
// Try chopping back the array of cache entries and the cache file.
|
|
Truncate();
|
|
|
|
// Count the blocks allocated for readahead of non-seekable streams
|
|
// (these blocks can't be freed but we don't want them to monopolize the
|
|
// cache)
|
|
int32_t nonSeekableReadaheadBlockCount = 0;
|
|
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
|
MediaCacheStream* stream = mStreams[i];
|
|
if (!stream->mIsTransportSeekable) {
|
|
nonSeekableReadaheadBlockCount += stream->mReadaheadBlocks.GetCount();
|
|
}
|
|
}
|
|
|
|
// If freeBlockCount is zero, then compute the latest of
|
|
// the predicted next-uses for all blocks
|
|
TimeDuration latestNextUse;
|
|
if (freeBlockCount == 0) {
|
|
int32_t reusableBlock = FindReusableBlock(now, nullptr, 0, maxBlocks);
|
|
if (reusableBlock >= 0) {
|
|
latestNextUse = PredictNextUse(now, reusableBlock);
|
|
}
|
|
}
|
|
|
|
int32_t resumeThreshold = Preferences::GetInt("media.cache_resume_threshold", 10);
|
|
int32_t readaheadLimit = Preferences::GetInt("media.cache_readahead_limit", 30);
|
|
|
|
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
|
actions.AppendElement(NONE);
|
|
|
|
MediaCacheStream* stream = mStreams[i];
|
|
if (stream->mClosed)
|
|
continue;
|
|
|
|
// Figure out where we should be reading from. It's the first
|
|
// uncached byte after the current mStreamOffset.
|
|
int64_t dataOffset = stream->GetCachedDataEndInternal(stream->mStreamOffset);
|
|
|
|
// Compute where we'd actually seek to to read at readOffset
|
|
int64_t desiredOffset = dataOffset;
|
|
if (stream->mIsTransportSeekable) {
|
|
if (desiredOffset > stream->mChannelOffset &&
|
|
desiredOffset <= stream->mChannelOffset + SEEK_VS_READ_THRESHOLD) {
|
|
// Assume it's more efficient to just keep reading up to the
|
|
// desired position instead of trying to seek
|
|
desiredOffset = stream->mChannelOffset;
|
|
}
|
|
} else {
|
|
// We can't seek directly to the desired offset...
|
|
if (stream->mChannelOffset > desiredOffset) {
|
|
// Reading forward won't get us anywhere, we need to go backwards.
|
|
// Seek back to 0 (the client will reopen the stream) and then
|
|
// read forward.
|
|
NS_WARNING("Can't seek backwards, so seeking to 0");
|
|
desiredOffset = 0;
|
|
// Flush cached blocks out, since if this is a live stream
|
|
// the cached data may be completely different next time we
|
|
// read it. We have to assume that live streams don't
|
|
// advertise themselves as being seekable...
|
|
ReleaseStreamBlocks(stream);
|
|
} else {
|
|
// otherwise reading forward is looking good, so just stay where we
|
|
// are and don't trigger a channel seek!
|
|
desiredOffset = stream->mChannelOffset;
|
|
}
|
|
}
|
|
|
|
// Figure out if we should be reading data now or not. It's amazing
|
|
// how complex this is, but each decision is simple enough.
|
|
bool enableReading;
|
|
if (stream->mStreamLength >= 0 && dataOffset >= stream->mStreamLength) {
|
|
// We want data at the end of the stream, where there's nothing to
|
|
// read. We don't want to try to read if we're suspended, because that
|
|
// might create a new channel and seek unnecessarily (and incorrectly,
|
|
// since HTTP doesn't allow seeking to the actual EOF), and we don't want
|
|
// to suspend if we're not suspended and already reading at the end of
|
|
// the stream, since there just might be more data than the server
|
|
// advertised with Content-Length, and we may as well keep reading.
|
|
// But we don't want to seek to the end of the stream if we're not
|
|
// already there.
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p at end of stream", stream));
|
|
enableReading = !stream->mCacheSuspended &&
|
|
stream->mStreamLength == stream->mChannelOffset;
|
|
} else if (desiredOffset < stream->mStreamOffset) {
|
|
// We're reading to try to catch up to where the current stream
|
|
// reader wants to be. Better not stop.
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p catching up", stream));
|
|
enableReading = true;
|
|
} else if (desiredOffset < stream->mStreamOffset + BLOCK_SIZE) {
|
|
// The stream reader is waiting for us, or nearly so. Better feed it.
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p feeding reader", stream));
|
|
enableReading = true;
|
|
} else if (!stream->mIsTransportSeekable &&
|
|
nonSeekableReadaheadBlockCount >= maxBlocks*NONSEEKABLE_READAHEAD_MAX) {
|
|
// This stream is not seekable and there are already too many blocks
|
|
// being cached for readahead for nonseekable streams (which we can't
|
|
// free). So stop reading ahead now.
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p throttling non-seekable readahead", stream));
|
|
enableReading = false;
|
|
} else if (mIndex.Length() > uint32_t(maxBlocks)) {
|
|
// We're in the process of bringing the cache size back to the
|
|
// desired limit, so don't bring in more data yet
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p throttling to reduce cache size", stream));
|
|
enableReading = false;
|
|
} else {
|
|
TimeDuration predictedNewDataUse = PredictNextUseForIncomingData(stream);
|
|
|
|
if (stream->mCacheSuspended &&
|
|
predictedNewDataUse.ToSeconds() > resumeThreshold) {
|
|
// Don't need data for a while, so don't bother waking up the stream
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p avoiding wakeup since more data is not needed", stream));
|
|
enableReading = false;
|
|
} else if (predictedNewDataUse.ToSeconds() > readaheadLimit) {
|
|
// Don't read ahead more than this much
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p throttling to avoid reading ahead too far", stream));
|
|
enableReading = false;
|
|
} else if (freeBlockCount > 0) {
|
|
// Free blocks in the cache, so keep reading
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p reading since there are free blocks", stream));
|
|
enableReading = true;
|
|
} else if (latestNextUse <= TimeDuration(0)) {
|
|
// No reusable blocks, so can't read anything
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p throttling due to no reusable blocks", stream));
|
|
enableReading = false;
|
|
} else {
|
|
// Read ahead if the data we expect to read is more valuable than
|
|
// the least valuable block in the main part of the cache
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p predict next data in %f, current worst block is %f",
|
|
stream, predictedNewDataUse.ToSeconds(), latestNextUse.ToSeconds()));
|
|
enableReading = predictedNewDataUse < latestNextUse;
|
|
}
|
|
}
|
|
|
|
if (enableReading) {
|
|
for (uint32_t j = 0; j < i; ++j) {
|
|
MediaCacheStream* other = mStreams[j];
|
|
if (other->mResourceID == stream->mResourceID &&
|
|
!other->mClient->IsSuspended() &&
|
|
other->mChannelOffset/BLOCK_SIZE == desiredOffset/BLOCK_SIZE) {
|
|
// This block is already going to be read by the other stream.
|
|
// So don't try to read it from this stream as well.
|
|
enableReading = false;
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p waiting on same block (%lld) from stream %p",
|
|
stream, desiredOffset/BLOCK_SIZE, other));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (stream->mChannelOffset != desiredOffset && enableReading) {
|
|
// We need to seek now.
|
|
NS_ASSERTION(stream->mIsTransportSeekable || desiredOffset == 0,
|
|
"Trying to seek in a non-seekable stream!");
|
|
// Round seek offset down to the start of the block. This is essential
|
|
// because we don't want to think we have part of a block already
|
|
// in mPartialBlockBuffer.
|
|
stream->mChannelOffset = (desiredOffset/BLOCK_SIZE)*BLOCK_SIZE;
|
|
actions[i] = stream->mCacheSuspended ? SEEK_AND_RESUME : SEEK;
|
|
} else if (enableReading && stream->mCacheSuspended) {
|
|
actions[i] = RESUME;
|
|
} else if (!enableReading && !stream->mCacheSuspended) {
|
|
actions[i] = SUSPEND;
|
|
}
|
|
}
|
|
#ifdef DEBUG
|
|
mInUpdate = false;
|
|
#endif
|
|
}
|
|
|
|
// Update the channel state without holding our cache lock. While we're
|
|
// doing this, decoder threads may be running and seeking, reading or changing
|
|
// other cache state. That's OK, they'll trigger new Update events and we'll
|
|
// get back here and revise our decisions. The important thing here is that
|
|
// performing these actions only depends on mChannelOffset and
|
|
// the action, which can only be written by the main thread (i.e., this
|
|
// thread), so we don't have races here.
|
|
|
|
// First, update the mCacheSuspended/mCacheEnded flags so that they're all correct
|
|
// when we fire our CacheClient commands below. Those commands can rely on these flags
|
|
// being set correctly for all streams.
|
|
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
|
MediaCacheStream* stream = mStreams[i];
|
|
switch (actions[i]) {
|
|
case SEEK:
|
|
case SEEK_AND_RESUME:
|
|
stream->mCacheSuspended = false;
|
|
stream->mChannelEnded = false;
|
|
break;
|
|
case RESUME:
|
|
stream->mCacheSuspended = false;
|
|
break;
|
|
case SUSPEND:
|
|
stream->mCacheSuspended = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
stream->mHasHadUpdate = true;
|
|
}
|
|
|
|
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
|
MediaCacheStream* stream = mStreams[i];
|
|
nsresult rv;
|
|
switch (actions[i]) {
|
|
case SEEK:
|
|
case SEEK_AND_RESUME:
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p CacheSeek to %lld (resume=%d)", stream,
|
|
(long long)stream->mChannelOffset, actions[i] == SEEK_AND_RESUME));
|
|
rv = stream->mClient->CacheClientSeek(stream->mChannelOffset,
|
|
actions[i] == SEEK_AND_RESUME);
|
|
break;
|
|
case RESUME:
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p Resumed", stream));
|
|
rv = stream->mClient->CacheClientResume();
|
|
break;
|
|
case SUSPEND:
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p Suspended", stream));
|
|
rv = stream->mClient->CacheClientSuspend();
|
|
break;
|
|
default:
|
|
rv = NS_OK;
|
|
break;
|
|
}
|
|
|
|
if (NS_FAILED(rv)) {
|
|
// Close the streams that failed due to error. This will cause all
|
|
// client Read and Seek operations on those streams to fail. Blocked
|
|
// Reads will also be woken up.
|
|
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
|
stream->CloseInternal(mon);
|
|
}
|
|
}
|
|
}
|
|
|
|
class UpdateEvent : public nsRunnable
|
|
{
|
|
public:
|
|
NS_IMETHOD Run()
|
|
{
|
|
if (gMediaCache) {
|
|
gMediaCache->Update();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
};
|
|
|
|
void
|
|
MediaCache::QueueUpdate()
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
// Queuing an update while we're in an update raises a high risk of
|
|
// triggering endless events
|
|
NS_ASSERTION(!mInUpdate,
|
|
"Queuing an update while we're in an update");
|
|
if (mUpdateQueued)
|
|
return;
|
|
mUpdateQueued = true;
|
|
nsCOMPtr<nsIRunnable> event = new UpdateEvent();
|
|
NS_DispatchToMainThread(event);
|
|
}
|
|
|
|
#ifdef DEBUG_VERIFY_CACHE
|
|
void
|
|
MediaCache::Verify()
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
mFreeBlocks.Verify();
|
|
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
|
|
MediaCacheStream* stream = mStreams[i];
|
|
stream->mReadaheadBlocks.Verify();
|
|
stream->mPlayedBlocks.Verify();
|
|
stream->mMetadataBlocks.Verify();
|
|
|
|
// Verify that the readahead blocks are listed in stream block order
|
|
int32_t block = stream->mReadaheadBlocks.GetFirstBlock();
|
|
int32_t lastStreamBlock = -1;
|
|
while (block >= 0) {
|
|
uint32_t j = 0;
|
|
while (mIndex[block].mOwners[j].mStream != stream) {
|
|
++j;
|
|
}
|
|
int32_t nextStreamBlock =
|
|
int32_t(mIndex[block].mOwners[j].mStreamBlock);
|
|
NS_ASSERTION(lastStreamBlock < nextStreamBlock,
|
|
"Blocks not increasing in readahead stream");
|
|
lastStreamBlock = nextStreamBlock;
|
|
block = stream->mReadaheadBlocks.GetNextBlock(block);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void
|
|
MediaCache::InsertReadaheadBlock(BlockOwner* aBlockOwner,
|
|
int32_t aBlockIndex)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
// Find the last block whose stream block is before aBlockIndex's
|
|
// stream block, and insert after it
|
|
MediaCacheStream* stream = aBlockOwner->mStream;
|
|
int32_t readaheadIndex = stream->mReadaheadBlocks.GetLastBlock();
|
|
while (readaheadIndex >= 0) {
|
|
BlockOwner* bo = GetBlockOwner(readaheadIndex, stream);
|
|
NS_ASSERTION(bo, "stream must own its blocks");
|
|
if (bo->mStreamBlock < aBlockOwner->mStreamBlock) {
|
|
stream->mReadaheadBlocks.AddAfter(aBlockIndex, readaheadIndex);
|
|
return;
|
|
}
|
|
NS_ASSERTION(bo->mStreamBlock > aBlockOwner->mStreamBlock,
|
|
"Duplicated blocks??");
|
|
readaheadIndex = stream->mReadaheadBlocks.GetPrevBlock(readaheadIndex);
|
|
}
|
|
|
|
stream->mReadaheadBlocks.AddFirstBlock(aBlockIndex);
|
|
Verify();
|
|
}
|
|
|
|
void
|
|
MediaCache::AllocateAndWriteBlock(MediaCacheStream* aStream, const void* aData,
|
|
MediaCacheStream::ReadMode aMode)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
int32_t streamBlockIndex = aStream->mChannelOffset/BLOCK_SIZE;
|
|
|
|
// Remove all cached copies of this block
|
|
ResourceStreamIterator iter(aStream->mResourceID);
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
while (streamBlockIndex >= int32_t(stream->mBlocks.Length())) {
|
|
stream->mBlocks.AppendElement(-1);
|
|
}
|
|
if (stream->mBlocks[streamBlockIndex] >= 0) {
|
|
// We no longer want to own this block
|
|
int32_t globalBlockIndex = stream->mBlocks[streamBlockIndex];
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Released block %d from stream %p block %d(%lld)",
|
|
globalBlockIndex, stream, streamBlockIndex, (long long)streamBlockIndex*BLOCK_SIZE));
|
|
RemoveBlockOwner(globalBlockIndex, stream);
|
|
}
|
|
}
|
|
|
|
// Extend the mBlocks array as necessary
|
|
|
|
TimeStamp now = TimeStamp::Now();
|
|
int32_t blockIndex = FindBlockForIncomingData(now, aStream);
|
|
if (blockIndex >= 0) {
|
|
FreeBlock(blockIndex);
|
|
|
|
Block* block = &mIndex[blockIndex];
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Allocated block %d to stream %p block %d(%lld)",
|
|
blockIndex, aStream, streamBlockIndex, (long long)streamBlockIndex*BLOCK_SIZE));
|
|
|
|
mFreeBlocks.RemoveBlock(blockIndex);
|
|
|
|
// Tell each stream using this resource about the new block.
|
|
ResourceStreamIterator iter(aStream->mResourceID);
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
BlockOwner* bo = block->mOwners.AppendElement();
|
|
if (!bo)
|
|
return;
|
|
|
|
bo->mStream = stream;
|
|
bo->mStreamBlock = streamBlockIndex;
|
|
bo->mLastUseTime = now;
|
|
stream->mBlocks[streamBlockIndex] = blockIndex;
|
|
if (streamBlockIndex*BLOCK_SIZE < stream->mStreamOffset) {
|
|
bo->mClass = aMode == MediaCacheStream::MODE_PLAYBACK
|
|
? PLAYED_BLOCK : METADATA_BLOCK;
|
|
// This must be the most-recently-used block, since we
|
|
// marked it as used now (which may be slightly bogus, but we'll
|
|
// treat it as used for simplicity).
|
|
GetListForBlock(bo)->AddFirstBlock(blockIndex);
|
|
Verify();
|
|
} else {
|
|
// This may not be the latest readahead block, although it usually
|
|
// will be. We may have to scan for the right place to insert
|
|
// the block in the list.
|
|
bo->mClass = READAHEAD_BLOCK;
|
|
InsertReadaheadBlock(bo, blockIndex);
|
|
}
|
|
}
|
|
|
|
nsresult rv = mFileCache->WriteBlock(blockIndex, reinterpret_cast<const uint8_t*>(aData));
|
|
if (NS_FAILED(rv)) {
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Released block %d from stream %p block %d(%lld)",
|
|
blockIndex, aStream, streamBlockIndex, (long long)streamBlockIndex*BLOCK_SIZE));
|
|
FreeBlock(blockIndex);
|
|
}
|
|
}
|
|
|
|
// Queue an Update since the cache state has changed (for example
|
|
// we might want to stop loading because the cache is full)
|
|
QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCache::OpenStream(MediaCacheStream* aStream)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p opened", aStream));
|
|
mStreams.AppendElement(aStream);
|
|
aStream->mResourceID = AllocateResourceID();
|
|
|
|
// Queue an update since a new stream has been opened.
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCache::ReleaseStream(MediaCacheStream* aStream)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p closed", aStream));
|
|
mStreams.RemoveElement(aStream);
|
|
|
|
// Update MediaCache again for |mStreams| is changed.
|
|
// We need to re-run Update() to ensure streams reading from the same resource
|
|
// as the removed stream get a chance to continue reading.
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCache::ReleaseStreamBlocks(MediaCacheStream* aStream)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
// XXX scanning the entire stream doesn't seem great, if not much of it
|
|
// is cached, but the only easy alternative is to scan the entire cache
|
|
// which isn't better
|
|
uint32_t length = aStream->mBlocks.Length();
|
|
for (uint32_t i = 0; i < length; ++i) {
|
|
int32_t blockIndex = aStream->mBlocks[i];
|
|
if (blockIndex >= 0) {
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Released block %d from stream %p block %d(%lld)",
|
|
blockIndex, aStream, i, (long long)i*BLOCK_SIZE));
|
|
RemoveBlockOwner(blockIndex, aStream);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCache::Truncate()
|
|
{
|
|
uint32_t end;
|
|
for (end = mIndex.Length(); end > 0; --end) {
|
|
if (!IsBlockFree(end - 1))
|
|
break;
|
|
mFreeBlocks.RemoveBlock(end - 1);
|
|
}
|
|
|
|
if (end < mIndex.Length()) {
|
|
mIndex.TruncateLength(end);
|
|
// XXX We could truncate the cache file here, but we don't seem
|
|
// to have a cross-platform API for doing that. At least when all
|
|
// streams are closed we shut down the cache, which erases the
|
|
// file at that point.
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCache::NoteBlockUsage(MediaCacheStream* aStream, int32_t aBlockIndex,
|
|
MediaCacheStream::ReadMode aMode,
|
|
TimeStamp aNow)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
if (aBlockIndex < 0) {
|
|
// this block is not in the cache yet
|
|
return;
|
|
}
|
|
|
|
BlockOwner* bo = GetBlockOwner(aBlockIndex, aStream);
|
|
if (!bo) {
|
|
// this block is not in the cache yet
|
|
return;
|
|
}
|
|
|
|
// The following check has to be <= because the stream offset has
|
|
// not yet been updated for the data read from this block
|
|
NS_ASSERTION(bo->mStreamBlock*BLOCK_SIZE <= bo->mStream->mStreamOffset,
|
|
"Using a block that's behind the read position?");
|
|
|
|
GetListForBlock(bo)->RemoveBlock(aBlockIndex);
|
|
bo->mClass =
|
|
(aMode == MediaCacheStream::MODE_METADATA || bo->mClass == METADATA_BLOCK)
|
|
? METADATA_BLOCK : PLAYED_BLOCK;
|
|
// Since this is just being used now, it can definitely be at the front
|
|
// of mMetadataBlocks or mPlayedBlocks
|
|
GetListForBlock(bo)->AddFirstBlock(aBlockIndex);
|
|
bo->mLastUseTime = aNow;
|
|
Verify();
|
|
}
|
|
|
|
void
|
|
MediaCache::NoteSeek(MediaCacheStream* aStream, int64_t aOldOffset)
|
|
{
|
|
mReentrantMonitor.AssertCurrentThreadIn();
|
|
|
|
if (aOldOffset < aStream->mStreamOffset) {
|
|
// We seeked forward. Convert blocks from readahead to played.
|
|
// Any readahead block that intersects the seeked-over range must
|
|
// be converted.
|
|
int32_t blockIndex = aOldOffset/BLOCK_SIZE;
|
|
int32_t endIndex =
|
|
std::min<int64_t>((aStream->mStreamOffset + BLOCK_SIZE - 1)/BLOCK_SIZE,
|
|
aStream->mBlocks.Length());
|
|
TimeStamp now = TimeStamp::Now();
|
|
while (blockIndex < endIndex) {
|
|
int32_t cacheBlockIndex = aStream->mBlocks[blockIndex];
|
|
if (cacheBlockIndex >= 0) {
|
|
// Marking the block used may not be exactly what we want but
|
|
// it's simple
|
|
NoteBlockUsage(aStream, cacheBlockIndex, MediaCacheStream::MODE_PLAYBACK,
|
|
now);
|
|
}
|
|
++blockIndex;
|
|
}
|
|
} else {
|
|
// We seeked backward. Convert from played to readahead.
|
|
// Any played block that is entirely after the start of the seeked-over
|
|
// range must be converted.
|
|
int32_t blockIndex =
|
|
(aStream->mStreamOffset + BLOCK_SIZE - 1)/BLOCK_SIZE;
|
|
int32_t endIndex =
|
|
std::min<int64_t>((aOldOffset + BLOCK_SIZE - 1)/BLOCK_SIZE,
|
|
aStream->mBlocks.Length());
|
|
while (blockIndex < endIndex) {
|
|
int32_t cacheBlockIndex = aStream->mBlocks[endIndex - 1];
|
|
if (cacheBlockIndex >= 0) {
|
|
BlockOwner* bo = GetBlockOwner(cacheBlockIndex, aStream);
|
|
NS_ASSERTION(bo, "Stream doesn't own its blocks?");
|
|
if (bo->mClass == PLAYED_BLOCK) {
|
|
aStream->mPlayedBlocks.RemoveBlock(cacheBlockIndex);
|
|
bo->mClass = READAHEAD_BLOCK;
|
|
// Adding this as the first block is sure to be OK since
|
|
// this must currently be the earliest readahead block
|
|
// (that's why we're proceeding backwards from the end of
|
|
// the seeked range to the start)
|
|
aStream->mReadaheadBlocks.AddFirstBlock(cacheBlockIndex);
|
|
Verify();
|
|
}
|
|
}
|
|
--endIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::NotifyDataLength(int64_t aLength)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
mStreamLength = aLength;
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::NotifyDataStarted(int64_t aOffset)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
NS_WARN_IF_FALSE(aOffset == mChannelOffset,
|
|
"Server is giving us unexpected offset");
|
|
mChannelOffset = aOffset;
|
|
if (mStreamLength >= 0) {
|
|
// If we started reading at a certain offset, then for sure
|
|
// the stream is at least that long.
|
|
mStreamLength = std::max(mStreamLength, mChannelOffset);
|
|
}
|
|
}
|
|
|
|
bool
|
|
MediaCacheStream::UpdatePrincipal(nsIPrincipal* aPrincipal)
|
|
{
|
|
return nsContentUtils::CombineResourcePrincipals(&mPrincipal, aPrincipal);
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::NotifyDataReceived(int64_t aSize, const char* aData,
|
|
nsIPrincipal* aPrincipal)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
// Update principals before putting the data in the cache. This is important,
|
|
// we want to make sure all principals are updated before any consumer
|
|
// can see the new data.
|
|
// We do this without holding the cache monitor, in case the client wants
|
|
// to do something that takes a lock.
|
|
{
|
|
MediaCache::ResourceStreamIterator iter(mResourceID);
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
if (stream->UpdatePrincipal(aPrincipal)) {
|
|
stream->mClient->CacheClientNotifyPrincipalChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
int64_t size = aSize;
|
|
const char* data = aData;
|
|
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p DataReceived at %lld count=%lld",
|
|
this, (long long)mChannelOffset, (long long)aSize));
|
|
|
|
// We process the data one block (or part of a block) at a time
|
|
while (size > 0) {
|
|
uint32_t blockIndex = mChannelOffset/BLOCK_SIZE;
|
|
int32_t blockOffset = int32_t(mChannelOffset - blockIndex*BLOCK_SIZE);
|
|
int32_t chunkSize = std::min<int64_t>(BLOCK_SIZE - blockOffset, size);
|
|
|
|
// This gets set to something non-null if we have a whole block
|
|
// of data to write to the cache
|
|
const char* blockDataToStore = nullptr;
|
|
ReadMode mode = MODE_PLAYBACK;
|
|
if (blockOffset == 0 && chunkSize == BLOCK_SIZE) {
|
|
// We received a whole block, so avoid a useless copy through
|
|
// mPartialBlockBuffer
|
|
blockDataToStore = data;
|
|
} else {
|
|
if (blockOffset == 0) {
|
|
// We've just started filling this buffer so now is a good time
|
|
// to clear this flag.
|
|
mMetadataInPartialBlockBuffer = false;
|
|
}
|
|
memcpy(reinterpret_cast<char*>(mPartialBlockBuffer.get()) + blockOffset,
|
|
data, chunkSize);
|
|
|
|
if (blockOffset + chunkSize == BLOCK_SIZE) {
|
|
// We completed a block, so lets write it out.
|
|
blockDataToStore = reinterpret_cast<char*>(mPartialBlockBuffer.get());
|
|
if (mMetadataInPartialBlockBuffer) {
|
|
mode = MODE_METADATA;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (blockDataToStore) {
|
|
gMediaCache->AllocateAndWriteBlock(this, blockDataToStore, mode);
|
|
}
|
|
|
|
mChannelOffset += chunkSize;
|
|
size -= chunkSize;
|
|
data += chunkSize;
|
|
}
|
|
|
|
MediaCache::ResourceStreamIterator iter(mResourceID);
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
if (stream->mStreamLength >= 0) {
|
|
// The stream is at least as long as what we've read
|
|
stream->mStreamLength = std::max(stream->mStreamLength, mChannelOffset);
|
|
}
|
|
stream->mClient->CacheClientNotifyDataReceived();
|
|
}
|
|
|
|
// Notify in case there's a waiting reader
|
|
// XXX it would be fairly easy to optimize things a lot more to
|
|
// avoid waking up reader threads unnecessarily
|
|
mon.NotifyAll();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::FlushPartialBlockInternal(bool aNotifyAll)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
|
|
int32_t blockOffset = int32_t(mChannelOffset%BLOCK_SIZE);
|
|
if (blockOffset > 0) {
|
|
CACHE_LOG(PR_LOG_DEBUG,
|
|
("Stream %p writing partial block: [%d] bytes; "
|
|
"mStreamOffset [%lld] mChannelOffset[%lld] mStreamLength [%lld] "
|
|
"notifying: [%s]",
|
|
this, blockOffset, mStreamOffset, mChannelOffset, mStreamLength,
|
|
aNotifyAll ? "yes" : "no"));
|
|
|
|
// Write back the partial block
|
|
memset(reinterpret_cast<char*>(mPartialBlockBuffer.get()) + blockOffset, 0,
|
|
BLOCK_SIZE - blockOffset);
|
|
gMediaCache->AllocateAndWriteBlock(this, mPartialBlockBuffer,
|
|
mMetadataInPartialBlockBuffer ? MODE_METADATA : MODE_PLAYBACK);
|
|
if (aNotifyAll) {
|
|
// Wake up readers who may be waiting for this data
|
|
mon.NotifyAll();
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::FlushPartialBlock()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
|
|
// Write the current partial block to memory.
|
|
// Note: This writes a full block, so if data is not at the end of the
|
|
// stream, the decoder must subsequently choose correct start and end offsets
|
|
// for reading/seeking.
|
|
FlushPartialBlockInternal(false);
|
|
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::NotifyDataEnded(nsresult aStatus)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
|
|
if (NS_FAILED(aStatus)) {
|
|
// Disconnect from other streams sharing our resource, since they
|
|
// should continue trying to load. Our load might have been deliberately
|
|
// canceled and that shouldn't affect other streams.
|
|
mResourceID = gMediaCache->AllocateResourceID();
|
|
}
|
|
|
|
// It is prudent to update channel/cache status before calling
|
|
// CacheClientNotifyDataEnded() which will read |mChannelEnded|.
|
|
FlushPartialBlockInternal(true);
|
|
mChannelEnded = true;
|
|
gMediaCache->QueueUpdate();
|
|
|
|
MediaCache::ResourceStreamIterator iter(mResourceID);
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
if (NS_SUCCEEDED(aStatus)) {
|
|
// We read the whole stream, so remember the true length
|
|
stream->mStreamLength = mChannelOffset;
|
|
}
|
|
if (!stream->mDidNotifyDataEnded) {
|
|
stream->mDidNotifyDataEnded = true;
|
|
stream->mNotifyDataEndedStatus = aStatus;
|
|
stream->mClient->CacheClientNotifyDataEnded(aStatus);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::NotifyChannelRecreated()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
mChannelEnded = false;
|
|
mDidNotifyDataEnded = false;
|
|
}
|
|
|
|
MediaCacheStream::~MediaCacheStream()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
NS_ASSERTION(!mPinCount, "Unbalanced Pin");
|
|
|
|
if (gMediaCache) {
|
|
NS_ASSERTION(mClosed, "Stream was not closed");
|
|
gMediaCache->ReleaseStream(this);
|
|
MediaCache::MaybeShutdown();
|
|
}
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::SetTransportSeekable(bool aIsTransportSeekable)
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
NS_ASSERTION(mIsTransportSeekable || aIsTransportSeekable ||
|
|
mChannelOffset == 0, "channel offset must be zero when we become non-seekable");
|
|
mIsTransportSeekable = aIsTransportSeekable;
|
|
// Queue an Update since we may change our strategy for dealing
|
|
// with this stream
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
bool
|
|
MediaCacheStream::IsTransportSeekable()
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
return mIsTransportSeekable;
|
|
}
|
|
|
|
bool
|
|
MediaCacheStream::AreAllStreamsForResourceSuspended()
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
MediaCache::ResourceStreamIterator iter(mResourceID);
|
|
// Look for a stream that's able to read the data we need
|
|
int64_t dataOffset = -1;
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
if (stream->mCacheSuspended || stream->mChannelEnded || stream->mClosed) {
|
|
continue;
|
|
}
|
|
if (dataOffset < 0) {
|
|
dataOffset = GetCachedDataEndInternal(mStreamOffset);
|
|
}
|
|
// Ignore streams that are reading beyond the data we need
|
|
if (stream->mChannelOffset > dataOffset) {
|
|
continue;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::Close()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
CloseInternal(mon);
|
|
// Queue an Update since we may have created more free space. Don't do
|
|
// it from CloseInternal since that gets called by Update() itself
|
|
// sometimes, and we try to not to queue updates from Update().
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::EnsureCacheUpdate()
|
|
{
|
|
if (mHasHadUpdate)
|
|
return;
|
|
gMediaCache->Update();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::CloseInternal(ReentrantMonitorAutoEnter& aReentrantMonitor)
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
if (mClosed)
|
|
return;
|
|
mClosed = true;
|
|
gMediaCache->ReleaseStreamBlocks(this);
|
|
// Wake up any blocked readers
|
|
aReentrantMonitor.NotifyAll();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::Pin()
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
++mPinCount;
|
|
// Queue an Update since we may no longer want to read more into the
|
|
// cache, if this stream's block have become non-evictable
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::Unpin()
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
NS_ASSERTION(mPinCount > 0, "Unbalanced Unpin");
|
|
--mPinCount;
|
|
// Queue an Update since we may be able to read more into the
|
|
// cache, if this stream's block have become evictable
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
int64_t
|
|
MediaCacheStream::GetLength()
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
return mStreamLength;
|
|
}
|
|
|
|
int64_t
|
|
MediaCacheStream::GetNextCachedData(int64_t aOffset)
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
return GetNextCachedDataInternal(aOffset);
|
|
}
|
|
|
|
int64_t
|
|
MediaCacheStream::GetCachedDataEnd(int64_t aOffset)
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
return GetCachedDataEndInternal(aOffset);
|
|
}
|
|
|
|
bool
|
|
MediaCacheStream::IsDataCachedToEndOfStream(int64_t aOffset)
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
if (mStreamLength < 0)
|
|
return false;
|
|
return GetCachedDataEndInternal(aOffset) >= mStreamLength;
|
|
}
|
|
|
|
int64_t
|
|
MediaCacheStream::GetCachedDataEndInternal(int64_t aOffset)
|
|
{
|
|
gMediaCache->GetReentrantMonitor().AssertCurrentThreadIn();
|
|
uint32_t startBlockIndex = aOffset/BLOCK_SIZE;
|
|
uint32_t blockIndex = startBlockIndex;
|
|
while (blockIndex < mBlocks.Length() && mBlocks[blockIndex] != -1) {
|
|
++blockIndex;
|
|
}
|
|
int64_t result = blockIndex*BLOCK_SIZE;
|
|
if (blockIndex == mChannelOffset/BLOCK_SIZE) {
|
|
// The block containing mChannelOffset may be partially read but not
|
|
// yet committed to the main cache
|
|
result = mChannelOffset;
|
|
}
|
|
if (mStreamLength >= 0) {
|
|
// The last block in the cache may only be partially valid, so limit
|
|
// the cached range to the stream length
|
|
result = std::min(result, mStreamLength);
|
|
}
|
|
return std::max(result, aOffset);
|
|
}
|
|
|
|
int64_t
|
|
MediaCacheStream::GetNextCachedDataInternal(int64_t aOffset)
|
|
{
|
|
gMediaCache->GetReentrantMonitor().AssertCurrentThreadIn();
|
|
if (aOffset == mStreamLength)
|
|
return -1;
|
|
|
|
uint32_t startBlockIndex = aOffset/BLOCK_SIZE;
|
|
uint32_t channelBlockIndex = mChannelOffset/BLOCK_SIZE;
|
|
|
|
if (startBlockIndex == channelBlockIndex &&
|
|
aOffset < mChannelOffset) {
|
|
// The block containing mChannelOffset is partially read, but not
|
|
// yet committed to the main cache. aOffset lies in the partially
|
|
// read portion, thus it is effectively cached.
|
|
return aOffset;
|
|
}
|
|
|
|
if (startBlockIndex >= mBlocks.Length())
|
|
return -1;
|
|
|
|
// Is the current block cached?
|
|
if (mBlocks[startBlockIndex] != -1)
|
|
return aOffset;
|
|
|
|
// Count the number of uncached blocks
|
|
bool hasPartialBlock = (mChannelOffset % BLOCK_SIZE) != 0;
|
|
uint32_t blockIndex = startBlockIndex + 1;
|
|
while (true) {
|
|
if ((hasPartialBlock && blockIndex == channelBlockIndex) ||
|
|
(blockIndex < mBlocks.Length() && mBlocks[blockIndex] != -1)) {
|
|
// We at the incoming channel block, which has has data in it,
|
|
// or are we at a cached block. Return index of block start.
|
|
return blockIndex * BLOCK_SIZE;
|
|
}
|
|
|
|
// No more cached blocks?
|
|
if (blockIndex >= mBlocks.Length())
|
|
return -1;
|
|
|
|
++blockIndex;
|
|
}
|
|
|
|
NS_NOTREACHED("Should return in loop");
|
|
return -1;
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::SetReadMode(ReadMode aMode)
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
if (aMode == mCurrentMode)
|
|
return;
|
|
mCurrentMode = aMode;
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
void
|
|
MediaCacheStream::SetPlaybackRate(uint32_t aBytesPerSecond)
|
|
{
|
|
NS_ASSERTION(aBytesPerSecond > 0, "Zero playback rate not allowed");
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
if (aBytesPerSecond == mPlaybackBytesPerSecond)
|
|
return;
|
|
mPlaybackBytesPerSecond = aBytesPerSecond;
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
|
|
nsresult
|
|
MediaCacheStream::Seek(int32_t aWhence, int64_t aOffset)
|
|
{
|
|
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
if (mClosed)
|
|
return NS_ERROR_FAILURE;
|
|
|
|
int64_t oldOffset = mStreamOffset;
|
|
switch (aWhence) {
|
|
case PR_SEEK_END:
|
|
if (mStreamLength < 0)
|
|
return NS_ERROR_FAILURE;
|
|
mStreamOffset = mStreamLength + aOffset;
|
|
break;
|
|
case PR_SEEK_CUR:
|
|
mStreamOffset += aOffset;
|
|
break;
|
|
case PR_SEEK_SET:
|
|
mStreamOffset = aOffset;
|
|
break;
|
|
default:
|
|
NS_ERROR("Unknown whence");
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
CACHE_LOG(PR_LOG_DEBUG, ("Stream %p Seek to %lld", this, (long long)mStreamOffset));
|
|
gMediaCache->NoteSeek(this, oldOffset);
|
|
|
|
gMediaCache->QueueUpdate();
|
|
return NS_OK;
|
|
}
|
|
|
|
int64_t
|
|
MediaCacheStream::Tell()
|
|
{
|
|
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
return mStreamOffset;
|
|
}
|
|
|
|
nsresult
|
|
MediaCacheStream::Read(char* aBuffer, uint32_t aCount, uint32_t* aBytes)
|
|
{
|
|
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
if (mClosed)
|
|
return NS_ERROR_FAILURE;
|
|
|
|
uint32_t count = 0;
|
|
// Read one block (or part of a block) at a time
|
|
while (count < aCount) {
|
|
uint32_t streamBlock = uint32_t(mStreamOffset/BLOCK_SIZE);
|
|
uint32_t offsetInStreamBlock =
|
|
uint32_t(mStreamOffset - streamBlock*BLOCK_SIZE);
|
|
int64_t size = std::min(aCount - count, BLOCK_SIZE - offsetInStreamBlock);
|
|
|
|
if (mStreamLength >= 0) {
|
|
// Don't try to read beyond the end of the stream
|
|
int64_t bytesRemaining = mStreamLength - mStreamOffset;
|
|
if (bytesRemaining <= 0) {
|
|
// Get out of here and return NS_OK
|
|
break;
|
|
}
|
|
size = std::min(size, bytesRemaining);
|
|
// Clamp size until 64-bit file size issues (bug 500784) are fixed.
|
|
size = std::min(size, int64_t(INT32_MAX));
|
|
}
|
|
|
|
int32_t bytes;
|
|
int32_t cacheBlock = streamBlock < mBlocks.Length() ? mBlocks[streamBlock] : -1;
|
|
if (cacheBlock < 0) {
|
|
// We don't have a complete cached block here.
|
|
|
|
if (count > 0) {
|
|
// Some data has been read, so return what we've got instead of
|
|
// blocking or trying to find a stream with a partial block.
|
|
break;
|
|
}
|
|
|
|
// See if the data is available in the partial cache block of any
|
|
// stream reading this resource. We need to do this in case there is
|
|
// another stream with this resource that has all the data to the end of
|
|
// the stream but the data doesn't end on a block boundary.
|
|
MediaCacheStream* streamWithPartialBlock = nullptr;
|
|
MediaCache::ResourceStreamIterator iter(mResourceID);
|
|
while (MediaCacheStream* stream = iter.Next()) {
|
|
if (uint32_t(stream->mChannelOffset/BLOCK_SIZE) == streamBlock &&
|
|
mStreamOffset < stream->mChannelOffset) {
|
|
streamWithPartialBlock = stream;
|
|
break;
|
|
}
|
|
}
|
|
if (streamWithPartialBlock) {
|
|
// We can just use the data in mPartialBlockBuffer. In fact we should
|
|
// use it rather than waiting for the block to fill and land in
|
|
// the cache.
|
|
bytes = std::min<int64_t>(size, streamWithPartialBlock->mChannelOffset - mStreamOffset);
|
|
memcpy(aBuffer,
|
|
reinterpret_cast<char*>(streamWithPartialBlock->mPartialBlockBuffer.get()) + offsetInStreamBlock, bytes);
|
|
if (mCurrentMode == MODE_METADATA) {
|
|
streamWithPartialBlock->mMetadataInPartialBlockBuffer = true;
|
|
}
|
|
mStreamOffset += bytes;
|
|
count = bytes;
|
|
break;
|
|
}
|
|
|
|
// No data has been read yet, so block
|
|
mon.Wait();
|
|
if (mClosed) {
|
|
// We may have successfully read some data, but let's just throw
|
|
// that out.
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
gMediaCache->NoteBlockUsage(this, cacheBlock, mCurrentMode, TimeStamp::Now());
|
|
|
|
int64_t offset = cacheBlock*BLOCK_SIZE + offsetInStreamBlock;
|
|
NS_ABORT_IF_FALSE(size >= 0 && size <= INT32_MAX, "Size out of range.");
|
|
nsresult rv = gMediaCache->ReadCacheFile(offset, aBuffer + count, int32_t(size), &bytes);
|
|
if (NS_FAILED(rv)) {
|
|
if (count == 0)
|
|
return rv;
|
|
// If we did successfully read some data, may as well return it
|
|
break;
|
|
}
|
|
mStreamOffset += bytes;
|
|
count += bytes;
|
|
}
|
|
|
|
if (count > 0) {
|
|
// Some data was read, so queue an update since block priorities may
|
|
// have changed
|
|
gMediaCache->QueueUpdate();
|
|
}
|
|
CACHE_LOG(PR_LOG_DEBUG,
|
|
("Stream %p Read at %lld count=%d", this, (long long)(mStreamOffset-count), count));
|
|
*aBytes = count;
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
MediaCacheStream::ReadAt(int64_t aOffset, char* aBuffer,
|
|
uint32_t aCount, uint32_t* aBytes)
|
|
{
|
|
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
|
|
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
nsresult rv = Seek(nsISeekableStream::NS_SEEK_SET, aOffset);
|
|
if (NS_FAILED(rv)) return rv;
|
|
return Read(aBuffer, aCount, aBytes);
|
|
}
|
|
|
|
nsresult
|
|
MediaCacheStream::ReadFromCache(char* aBuffer,
|
|
int64_t aOffset,
|
|
int64_t aCount)
|
|
{
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
if (mClosed)
|
|
return NS_ERROR_FAILURE;
|
|
|
|
// Read one block (or part of a block) at a time
|
|
uint32_t count = 0;
|
|
int64_t streamOffset = aOffset;
|
|
while (count < aCount) {
|
|
uint32_t streamBlock = uint32_t(streamOffset/BLOCK_SIZE);
|
|
uint32_t offsetInStreamBlock =
|
|
uint32_t(streamOffset - streamBlock*BLOCK_SIZE);
|
|
int64_t size = std::min<int64_t>(aCount - count, BLOCK_SIZE - offsetInStreamBlock);
|
|
|
|
if (mStreamLength >= 0) {
|
|
// Don't try to read beyond the end of the stream
|
|
int64_t bytesRemaining = mStreamLength - streamOffset;
|
|
if (bytesRemaining <= 0) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
size = std::min(size, bytesRemaining);
|
|
// Clamp size until 64-bit file size issues (bug 500784) are fixed.
|
|
size = std::min(size, int64_t(INT32_MAX));
|
|
}
|
|
|
|
int32_t bytes;
|
|
uint32_t channelBlock = uint32_t(mChannelOffset/BLOCK_SIZE);
|
|
int32_t cacheBlock = streamBlock < mBlocks.Length() ? mBlocks[streamBlock] : -1;
|
|
if (channelBlock == streamBlock && streamOffset < mChannelOffset) {
|
|
// We can just use the data in mPartialBlockBuffer. In fact we should
|
|
// use it rather than waiting for the block to fill and land in
|
|
// the cache.
|
|
bytes = std::min<int64_t>(size, mChannelOffset - streamOffset);
|
|
memcpy(aBuffer + count,
|
|
reinterpret_cast<char*>(mPartialBlockBuffer.get()) + offsetInStreamBlock, bytes);
|
|
} else {
|
|
if (cacheBlock < 0) {
|
|
// We expect all blocks to be cached! Fail!
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
int64_t offset = cacheBlock*BLOCK_SIZE + offsetInStreamBlock;
|
|
NS_ABORT_IF_FALSE(size >= 0 && size <= INT32_MAX, "Size out of range.");
|
|
nsresult rv = gMediaCache->ReadCacheFile(offset, aBuffer + count, int32_t(size), &bytes);
|
|
if (NS_FAILED(rv)) {
|
|
return rv;
|
|
}
|
|
}
|
|
streamOffset += bytes;
|
|
count += bytes;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
MediaCacheStream::Init()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
|
|
|
|
if (mInitialized)
|
|
return NS_OK;
|
|
|
|
InitMediaCache();
|
|
if (!gMediaCache)
|
|
return NS_ERROR_FAILURE;
|
|
gMediaCache->OpenStream(this);
|
|
mInitialized = true;
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
MediaCacheStream::InitAsClone(MediaCacheStream* aOriginal)
|
|
{
|
|
if (!aOriginal->IsAvailableForSharing())
|
|
return NS_ERROR_FAILURE;
|
|
|
|
if (mInitialized)
|
|
return NS_OK;
|
|
|
|
nsresult rv = Init();
|
|
if (NS_FAILED(rv))
|
|
return rv;
|
|
mResourceID = aOriginal->mResourceID;
|
|
|
|
// Grab cache blocks from aOriginal as readahead blocks for our stream
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
|
|
mPrincipal = aOriginal->mPrincipal;
|
|
mStreamLength = aOriginal->mStreamLength;
|
|
mIsTransportSeekable = aOriginal->mIsTransportSeekable;
|
|
|
|
// Cloned streams are initially suspended, since there is no channel open
|
|
// initially for a clone.
|
|
mCacheSuspended = true;
|
|
mChannelEnded = true;
|
|
|
|
if (aOriginal->mDidNotifyDataEnded) {
|
|
mNotifyDataEndedStatus = aOriginal->mNotifyDataEndedStatus;
|
|
mDidNotifyDataEnded = true;
|
|
mClient->CacheClientNotifyDataEnded(mNotifyDataEndedStatus);
|
|
}
|
|
|
|
for (uint32_t i = 0; i < aOriginal->mBlocks.Length(); ++i) {
|
|
int32_t cacheBlockIndex = aOriginal->mBlocks[i];
|
|
if (cacheBlockIndex < 0)
|
|
continue;
|
|
|
|
while (i >= mBlocks.Length()) {
|
|
mBlocks.AppendElement(-1);
|
|
}
|
|
// Every block is a readahead block for the clone because the clone's initial
|
|
// stream offset is zero
|
|
gMediaCache->AddBlockOwnerAsReadahead(cacheBlockIndex, this, i);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult MediaCacheStream::GetCachedRanges(nsTArray<MediaByteRange>& aRanges)
|
|
{
|
|
// Take the monitor, so that the cached data ranges can't grow while we're
|
|
// trying to loop over them.
|
|
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
|
|
|
|
// We must be pinned while running this, otherwise the cached data ranges may
|
|
// shrink while we're trying to loop over them.
|
|
NS_ASSERTION(mPinCount > 0, "Must be pinned");
|
|
|
|
int64_t startOffset = GetNextCachedData(0);
|
|
while (startOffset >= 0) {
|
|
int64_t endOffset = GetCachedDataEnd(startOffset);
|
|
NS_ASSERTION(startOffset < endOffset, "Buffered range must end after its start");
|
|
// Bytes [startOffset..endOffset] are cached.
|
|
aRanges.AppendElement(MediaByteRange(startOffset, endOffset));
|
|
startOffset = GetNextCachedData(endOffset);
|
|
NS_ASSERTION(startOffset == -1 || startOffset > endOffset,
|
|
"Must have advanced to start of next range, or hit end of stream");
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
} // namespace mozilla
|
|
|