Skip to content

Commit 0f87997

Browse files
halx99xfbird
authored andcommitted
Improve android media player, also fix axmolengine#2101 (axmolengine#2109)
a. handle cbcr offset properly b. handle output dim properly
1 parent ef499b0 commit 0f87997

File tree

3 files changed

+207
-145
lines changed

3 files changed

+207
-145
lines changed

core/media/AndroidMediaEngine.cpp

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,63 +27,76 @@
2727
# include "platform/android/jni/JniHelper.h"
2828

2929
extern "C" {
30-
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeHandleEvent(JNIEnv* env, jclass, jlong pME, int arg1)
30+
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeFireEvent(JNIEnv* env, jclass, jlong pME, int arg1)
3131
{
3232
auto mediaEngine = (ax::AndroidMediaEngine*)((uintptr_t)pME);
3333
if (!mediaEngine)
3434
return;
3535

36-
mediaEngine->fireMediaEvent((ax::MEMediaEventType)arg1);
36+
mediaEngine->_fireMediaEvent((ax::MEMediaEventType)arg1);
3737
}
38-
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeHandleVideoSample(JNIEnv* env,
39-
jclass,
40-
jlong pME,
41-
jobject sampleBuffer,
42-
int sampleLen,
43-
int outputX,
44-
int outputY,
45-
int videoX,
46-
int videoY,
47-
int rotation,
48-
int videoPF)
38+
39+
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeStoreVideoMeta(JNIEnv* env,
40+
jclass,
41+
jlong pME,
42+
int outputX,
43+
int outputY,
44+
int videoX,
45+
int videoY,
46+
int cbcrOffset,
47+
int rotation,
48+
int videoPF)
49+
{
50+
auto mediaEngine = (ax::AndroidMediaEngine*)((uintptr_t)pME);
51+
if (!mediaEngine)
52+
return;
53+
54+
mediaEngine->_storeVideoMeta(outputX, outputY, videoX, videoY, cbcrOffset, rotation, videoPF);
55+
}
56+
57+
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeStoreLastVideoSample(JNIEnv* env,
58+
jclass,
59+
jlong pME,
60+
jobject sampleBuffer,
61+
int sampleLen)
4962
{
5063
auto mediaEngine = (ax::AndroidMediaEngine*)((uintptr_t)pME);
5164
if (!mediaEngine)
5265
return;
5366

5467
auto sampleData = static_cast<uint8_t*>(env->GetDirectBufferAddress(sampleBuffer));
5568

56-
mediaEngine->handleVideoSample(sampleData, sampleLen, outputX, outputY, videoX, videoY, rotation, videoPF);
69+
mediaEngine->_storeLastVideoSample(sampleData, sampleLen);
5770
}
5871

59-
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeSetDuration(JNIEnv* env,
60-
jclass,
61-
jlong pME,
62-
double duration)
72+
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeStoreDuration(JNIEnv* env,
73+
jclass,
74+
jlong pME,
75+
double duration)
6376
{
6477
auto mediaEngine = (ax::AndroidMediaEngine*)((uintptr_t)pME);
6578
if (!mediaEngine)
6679
return;
6780

68-
mediaEngine->updateDuration(duration);
81+
mediaEngine->_storeDuration(duration);
6982
}
7083

71-
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeSetCurrentTime(JNIEnv* env,
72-
jclass,
73-
jlong pME,
74-
double currentTime)
84+
JNIEXPORT void JNICALL Java_org_axmol_lib_AxmolMediaEngine_nativeStoreCurrentTime(JNIEnv* env,
85+
jclass,
86+
jlong pME,
87+
double currentTime)
7588
{
7689
auto mediaEngine = (ax::AndroidMediaEngine*)((uintptr_t)pME);
7790
if (!mediaEngine)
7891
return;
7992

80-
mediaEngine->updateCurrentTime(currentTime);
93+
mediaEngine->_storeCurrentTime(currentTime);
8194
}
8295
}
8396

8497
NS_AX_BEGIN
8598

86-
static const char* className = "org.axmol.lib.AxmolMediaEngine";
99+
static const char* className = "org.axmol.lib.AxmolMediaEngine";
87100

88101
AndroidMediaEngine::AndroidMediaEngine()
89102
{
@@ -161,8 +174,9 @@ bool AndroidMediaEngine::transferVideoFrame()
161174

162175
auto& buffer = _frameBuffer2;
163176

164-
ax::MEVideoFrame frame{buffer.data(), buffer.data() + _outputDim.x * _outputDim.y, buffer.size(),
165-
ax::MEVideoPixelDesc{static_cast<ax::MEVideoPixelFormat>(_videoPF), _outputDim}, _videoDim};
177+
ax::MEVideoFrame frame{buffer.data(), buffer.data() + _cbcrOffset, buffer.size(),
178+
ax::MEVideoPixelDesc{static_cast<ax::MEVideoPixelFormat>(_videoPF), _outputDim},
179+
_videoDim};
166180
frame._vpd._rotation = _videoRotation;
167181
assert(static_cast<int>(frame._dataLen) >= frame._vpd._dim.x * frame._vpd._dim.y * 3 / 2);
168182
_onVideoFrame(frame);
@@ -173,23 +187,29 @@ bool AndroidMediaEngine::transferVideoFrame()
173187
return false;
174188
}
175189

176-
void AndroidMediaEngine::handleVideoSample(const uint8_t* buf,
177-
size_t len,
178-
int outputX,
179-
int outputY,
180-
int videoX,
181-
int videoY,
182-
int rotation,
183-
int videoPF)
190+
void AndroidMediaEngine::_storeVideoMeta(int outputX,
191+
int outputY,
192+
int videoX,
193+
int videoY,
194+
int cbcrOffset,
195+
int rotation,
196+
int videoPF)
184197
{
185-
std::unique_lock<std::mutex> lck(_frameBuffer1Mtx);
186-
_frameBuffer1.assign(buf, buf + len);
187198
_outputDim.set(outputX, outputY);
188199
_videoDim.set(videoX, videoY);
200+
_cbcrOffset = cbcrOffset;
189201
_videoRotation = rotation;
190202
_videoPF = videoPF;
191203
}
192204

205+
206+
void AndroidMediaEngine::_storeLastVideoSample(const uint8_t* buf, size_t len)
207+
{
208+
std::unique_lock<std::mutex> lck(_frameBuffer1Mtx);
209+
_frameBuffer1.assign(buf, buf + len);
210+
}
211+
212+
// } // namespace ax
193213
NS_AX_END
194214

195215
#endif

core/media/AndroidMediaEngine.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@ class AndroidMediaEngine : public MediaEngine
3333
public:
3434
AndroidMediaEngine();
3535
~AndroidMediaEngine();
36-
void fireMediaEvent(MEMediaEventType event)
37-
{
38-
if (_onMediaEvent)
39-
_onMediaEvent(event);
40-
}
4136
void setCallbacks(std::function<void(MEMediaEventType)> onMediaEvent,
4237
std::function<void(const MEVideoFrame&)> onVideoFrame) override
4338
{
@@ -59,9 +54,16 @@ class AndroidMediaEngine : public MediaEngine
5954
MEMediaState getState() const override;
6055
bool transferVideoFrame() override;
6156

62-
void handleVideoSample(const uint8_t* buf, size_t len, int outputX, int outputY, int videoX, int videoY, int rotation, int videoPF);
63-
void updateCurrentTime(double currentTime) { _currentTime = currentTime; }
64-
void updateDuration(double duration) { _duration = duration; }
57+
// internal stubs
58+
void _fireMediaEvent(MEMediaEventType event)
59+
{
60+
if (_onMediaEvent)
61+
_onMediaEvent(event);
62+
}
63+
void _storeDuration(double duration) { _duration = duration; }
64+
void _storeCurrentTime(double currentTime) { _currentTime = currentTime; }
65+
void _storeLastVideoSample(const uint8_t* buf, size_t len);
66+
void _storeVideoMeta(int outputX, int outputY, int videoX, int videoY, int cbcrOffset, int rotation, int videoPF);
6567

6668
private:
6769
void* context{}; // java object strong-refs
@@ -70,6 +72,7 @@ class AndroidMediaEngine : public MediaEngine
7072

7173
MEIntPoint _outputDim;
7274
MEIntPoint _videoDim;
75+
int _cbcrOffset{0};
7376
int _videoRotation{0};
7477
int _videoPF{-1};
7578

0 commit comments

Comments
 (0)