1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5  * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #if !defined(AndroidMediaReader_h_)
7 #define AndroidMediaReader_h_
8 
9 #include "mozilla/Attributes.h"
10 #include "MediaResource.h"
11 #include "MediaDecoderReader.h"
12 #include "ImageContainer.h"
13 #include "mozilla/layers/SharedRGBImage.h"
14 
15 #include "MPAPI.h"
16 
17 class nsACString;
18 
19 namespace mozilla {
20 
21 class AbstractMediaDecoder;
22 
23 namespace layers {
24 class ImageContainer;
25 }
26 
27 class AndroidMediaReader : public MediaDecoderReader
28 {
29   nsCString mType;
30   MPAPI::Decoder *mPlugin;
31   bool mHasAudio;
32   bool mHasVideo;
33   nsIntRect mPicture;
34   nsIntSize mInitialFrame;
35   int64_t mVideoSeekTimeUs;
36   int64_t mAudioSeekTimeUs;
37   RefPtr<VideoData> mLastVideoFrame;
38   MozPromiseHolder<MediaDecoderReader::SeekPromise> mSeekPromise;
39   MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mSeekRequest;
40 public:
41   AndroidMediaReader(AbstractMediaDecoder* aDecoder,
42                      const nsACString& aContentType);
43 
44   nsresult ResetDecode(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
45                                                    TrackInfo::kVideoTrack)) override;
46 
47   bool DecodeAudioData() override;
48   bool DecodeVideoFrame(bool &aKeyframeSkip, int64_t aTimeThreshold) override;
49 
50   nsresult ReadMetadata(MediaInfo* aInfo, MetadataTags** aTags) override;
51   RefPtr<SeekPromise> Seek(SeekTarget aTarget, int64_t aEndTime) override;
52 
53   RefPtr<ShutdownPromise> Shutdown() override;
54 
55   class ImageBufferCallback : public MPAPI::BufferCallback {
56     typedef mozilla::layers::Image Image;
57 
58   public:
59     ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer);
60     void *operator()(size_t aWidth, size_t aHeight,
61                      MPAPI::ColorFormat aColorFormat) override;
62     already_AddRefed<Image> GetImage();
63 
64   private:
65     uint8_t *CreateI420Image(size_t aWidth, size_t aHeight);
66 
67     mozilla::layers::ImageContainer *mImageContainer;
68     RefPtr<Image> mImage;
69   };
70 
71 };
72 
73 } // namespace mozilla
74 
75 #endif
76