| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_FILTERS_ANDROID_VIDEO_FRAME_EXTRACTOR_H_ |
| #define MEDIA_FILTERS_ANDROID_VIDEO_FRAME_EXTRACTOR_H_ |
| |
| #include <stdint.h> |
| #include <memory> |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "media/base/media_export.h" |
| #include "media/filters/ffmpeg_demuxer.h" |
| |
| struct AVPacket; |
| struct AVStream; |
| |
| namespace media { |
| |
| class BlockingUrlProtocol; |
| class DataSource; |
| class FFmpegBitstreamConverter; |
| class FFmpegGlue; |
| class VideoDecoderConfig; |
| |
| // This class synchronously extracts a video key frame. Should be used in |
| // sandboxed process since the media data is user input. |
| // Work flow: |
| // 1. Demuxes one video frame with FFMPEG, into an AVPacket. |
| // 2. Adds the bitstream filter, so decoder can understand the input data. |
| // 3. Returns the encoded video key frame and the decoding configuration for |
| // later decoding. On Android, currently decoding needs to happen in privileged |
| // process to access low level graphic card driver on disk. |
| class MEDIA_EXPORT VideoFrameExtractor { |
| public: |
| using VideoFrameCallback = |
| base::OnceCallback<void(bool success, |
| std::vector<uint8_t> data, |
| const VideoDecoderConfig& decoder_config)>; |
| |
| explicit VideoFrameExtractor(DataSource* data_source); |
| |
| VideoFrameExtractor(const VideoFrameExtractor&) = delete; |
| VideoFrameExtractor& operator=(const VideoFrameExtractor&) = delete; |
| |
| ~VideoFrameExtractor(); |
| |
| // Starts to retrieve thumbnail from video frame. |
| void Start(VideoFrameCallback video_frame_callback); |
| |
| private: |
| // Reads one video frame from video stream. |
| ScopedAVPacket ReadVideoFrame(); |
| |
| // Converts the video frame to something that the decoder can understand. |
| void ConvertPacket(AVPacket* packet); |
| |
| // Called when video frame is successfully extracted. |
| void NotifyComplete(std::vector<uint8_t> encoded_frame, |
| const VideoDecoderConfig& config); |
| |
| // Called when error happens. |
| void OnError(); |
| |
| // Objects to read video data. |
| DataSource* data_source_; |
| std::unique_ptr<BlockingUrlProtocol> protocol_; |
| std::unique_ptr<FFmpegGlue> glue_; |
| |
| // FFMPEG related objects to prepare video frame to decode. |
| ScopedAVPacket packet_; |
| int video_stream_index_; |
| AVStream* video_stream_ = nullptr; |
| VideoDecoderConfig video_config_; |
| std::unique_ptr<FFmpegBitstreamConverter> bitstream_converter_; |
| |
| VideoFrameCallback video_frame_callback_; |
| |
| base::WeakPtrFactory<VideoFrameExtractor> weak_factory_{this}; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_FILTERS_ANDROID_VIDEO_FRAME_EXTRACTOR_H_ |