kodi
DVDVideoCodecAndroidMediaCodec.h
1 /*
2  * Copyright (C) 2013-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "DVDStreamInfo.h"
12 #include "DVDVideoCodec.h"
13 #include "cores/VideoPlayer/Buffers/VideoBuffer.h"
14 #include "threads/SingleLock.h"
15 #include "threads/Thread.h"
16 #include "utils/Geometry.h"
17 
18 #include "platform/android/activity/JNIXBMCVideoView.h"
19 
20 #include <atomic>
21 #include <deque>
22 #include <memory>
23 #include <utility>
24 #include <vector>
25 
26 #include <android/native_window.h>
27 #include <android/native_window_jni.h>
28 #include <androidjni/Surface.h>
29 
30 class CJNISurface;
31 class CJNISurfaceTexture;
32 class CJNIMediaCodec;
33 class CJNIMediaCrypto;
34 class CJNIMediaFormat;
35 class CJNIMediaCodecBufferInfo;
37 class CJNIByteBuffer;
39 
40 struct DemuxCryptoInfo;
41 struct mpeg2_sequence;
42 
43 
44 typedef struct amc_demux
45 {
46  uint8_t* pData;
47  int iSize;
48  double dts;
49  double pts;
50 } amc_demux;
51 
53 
55 {
56 public:
57  CMediaCodecVideoBuffer(int id) : CVideoBuffer(id) {}
58  ~CMediaCodecVideoBuffer() override = default;
59 
60  void Set(int internalId,
61  int textureId,
62  std::shared_ptr<CJNISurfaceTexture> surfaceTexture,
63  std::shared_ptr<CDVDMediaCodecOnFrameAvailable> frameAvailable,
64  std::shared_ptr<jni::CJNIXBMCVideoView> videoView);
65 
66  // meat and potatoes
67  bool WaitForFrame(int millis);
68  // MediaCodec related
69  void ReleaseOutputBuffer(bool render,
70  int64_t displayTime,
71  CMediaCodecVideoBufferPool* pool = nullptr);
72  // SurfaceTexture released
73  int GetBufferId() const;
74  int GetTextureId() const;
75  void GetTransformMatrix(float* textureMatrix);
76  void UpdateTexImage();
77  void RenderUpdate(const CRect& DestRect, int64_t displayTime);
78  bool HasSurfaceTexture() const { return m_surfacetexture.operator bool(); }
79 
80 private:
81  int m_bufferId = -1;
82  unsigned int m_textureId = 0;
83  // shared_ptr bits, shared between
84  // CDVDVideoCodecAndroidMediaCodec and LinuxRenderGLES.
85  std::shared_ptr<CJNISurfaceTexture> m_surfacetexture;
86  std::shared_ptr<CDVDMediaCodecOnFrameAvailable> m_frameready;
87  std::shared_ptr<jni::CJNIXBMCVideoView> m_videoview;
88 };
89 
91 {
92 public:
93  CMediaCodecVideoBufferPool(std::shared_ptr<CJNIMediaCodec> mediaCodec)
94  : m_codec(std::move(mediaCodec))
95  {
96  }
97 
98  ~CMediaCodecVideoBufferPool() override;
99 
100  CVideoBuffer* Get() override;
101  void Return(int id) override;
102 
103  std::shared_ptr<CJNIMediaCodec> GetMediaCodec();
104  void ResetMediaCodec();
105  void ReleaseMediaCodecBuffers();
106 
107 private:
108  CCriticalSection m_criticalSection;
109  std::shared_ptr<CJNIMediaCodec> m_codec;
110 
111  std::vector<CMediaCodecVideoBuffer*> m_videoBuffers;
112  std::vector<int> m_freeBuffers;
113 };
114 
115 class CDVDVideoCodecAndroidMediaCodec : public CDVDVideoCodec, public CJNISurfaceHolderCallback
116 {
117 public:
118  CDVDVideoCodecAndroidMediaCodec(CProcessInfo& processInfo, bool surface_render = false);
120 
121  // registration
122  static std::unique_ptr<CDVDVideoCodec> Create(CProcessInfo& processInfo);
123  static bool Register();
124 
125  // required overrides
126  bool Open(CDVDStreamInfo& hints, CDVDCodecOptions& options) override;
127  bool AddData(const DemuxPacket& packet) override;
128  void Reset() override;
129  bool Reconfigure(CDVDStreamInfo& hints) override;
130  VCReturn GetPicture(VideoPicture* pVideoPicture) override;
131  const char* GetName() override { return m_formatname.c_str(); }
132  void SetCodecControl(int flags) override;
133  unsigned GetAllowedReferences() override;
134 
135 protected:
136  void Dispose();
137  void FlushInternal(void);
138  void SignalEndOfStream();
139  void InjectExtraData(CJNIMediaFormat& mediaformat);
140  std::vector<uint8_t> GetHDRStaticMetadata();
141  bool ConfigureMediaCodec(void);
142  int GetOutputPicture(void);
143  void ConfigureOutputFormat(CJNIMediaFormat& mediaformat);
144  void UpdateFpsDuration();
145 
146  // surface handling functions
147  static void CallbackInitSurfaceTexture(void*);
148  void InitSurfaceTexture(void);
149  void ReleaseSurfaceTexture(void);
150 
151  CDVDStreamInfo m_hints;
152  std::string m_mime;
153  std::string m_codecname;
154  std::string m_formatname;
155  bool m_opened = false;
156  bool m_needSecureDecoder = false;
157  int m_codecControlFlags;
158  int m_state;
159 
160  std::shared_ptr<jni::CJNIXBMCVideoView> m_jnivideoview;
161  CJNISurface m_jnivideosurface;
162  unsigned int m_textureId = 0;
163  std::shared_ptr<CJNIMediaCodec> m_codec;
164  CJNIMediaCrypto* m_crypto = nullptr;
165  std::shared_ptr<CJNISurfaceTexture> m_surfaceTexture;
166  std::shared_ptr<CDVDMediaCodecOnFrameAvailable> m_frameAvailable;
167 
168  amc_demux m_demux_pkt;
169  std::shared_ptr<CMediaCodecVideoBufferPool> m_videoBufferPool;
170 
171  uint32_t m_OutputDuration = 0, m_fpsDuration = 0;
172  int64_t m_lastPTS = -1;
173  int64_t m_invalidPTSValue = 0;
174  double m_dtsShift = DVD_NOPTS_VALUE;
175 
176  static std::atomic<bool> m_InstanceGuard;
177 
178  std::unique_ptr<CBitstreamConverter> m_bitstream;
179  VideoPicture m_videobuffer;
180 
181  int m_indexInputBuffer;
182  bool m_render_surface;
183  mpeg2_sequence* m_mpeg2_sequence = nullptr;
184  int m_src_offset[4];
185  int m_src_stride[4];
186  bool m_useDTSforPTS = false;
187 
188  // CJNISurfaceHolderCallback interface
189 public:
190  void surfaceChanged(CJNISurfaceHolder holder, int format, int width, int height) override;
191  void surfaceCreated(CJNISurfaceHolder holder) override;
192  void surfaceDestroyed(CJNISurfaceHolder holder) override;
193 };
Definition: DVDVideoCodecAndroidMediaCodec.h:115
Definition: DVDStreamInfo.h:25
Definition: VideoBuffer.h:85
Definition: BitstreamConverter.h:30
Definition: DVDCodecs.h:23
Definition: DVDVideoCodecAndroidMediaCodec.h:44
Definition: VideoBuffer.h:51
Definition: BitstreamConverter.h:85
const char * GetName() override
should return codecs name
Definition: DVDVideoCodecAndroidMediaCodec.h:131
Definition: DVDVideoCodecAndroidMediaCodec.h:90
Definition: DVDVideoCodecAndroidMediaCodec.h:54
Definition: ProcessInfo.h:26
Definition: DemuxCrypto.h:51
Definition: DVDVideoCodecAndroidMediaCodec.cpp:77
Definition: DVDVideoCodec.h:36
Definition: DemuxPacket.h:22
Definition: DVDVideoCodec.h:110