Skip to content

Commit bb8d6b6

Browse files
committed
add methods to renderer
1 parent 9ee92bd commit bb8d6b6

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

jni/libmediaplayer/renderer.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,89 @@
1+
#include <android/log.h>
2+
13
extern "C" {
24

35
#include "libavcodec/avcodec.h"
46
#include "libavformat/avformat.h"
57

68
}
79

10+
#include "output.h"
811
#include "renderer.h"
912

13+
#define TAG "FFMpegRenderer"
14+
1015
Renderer::Renderer()
1116
{
17+
mQueue = new PacketQueue();
1218
}
1319

1420
Renderer::~Renderer()
1521
{
1622
}
23+
24+
bool Renderer::init(JNIEnv *env, jobject jsurface)
25+
{
26+
if(Output::VideoDriver_register(env, jsurface) != ANDROID_SURFACE_RESULT_SUCCESS) {
27+
return false;
28+
}
29+
if(Output::AudioDriver_register() != ANDROID_AUDIOTRACK_RESULT_SUCCESS) {
30+
return false;
31+
}
32+
return true;
33+
}
34+
35+
PacketQueue* Renderer::queue()
36+
{
37+
return mQueue;
38+
}
39+
40+
bool Renderer::startAsync(const char* err)
41+
{
42+
pthread_create(&mThread, NULL, startRendering, this);
43+
return true;
44+
}
45+
46+
void* Renderer::startRendering(void* ptr)
47+
{
48+
__android_log_print(ANDROID_LOG_INFO, TAG, "starting renderer thread");
49+
Renderer* renderer = (Renderer *) ptr;
50+
renderer->mRendering = true;
51+
renderer->render(ptr);
52+
renderer->mRendering = false;
53+
__android_log_print(ANDROID_LOG_INFO, TAG, "decoder renderer ended");
54+
}
55+
56+
bool Renderer::render(void* ptr)
57+
{
58+
AVPacket pPacket;
59+
60+
while(mRendering)
61+
{
62+
if(mQueue->get(&pPacket, true) < 0)
63+
{
64+
mRendering = false;
65+
return false;
66+
}
67+
68+
// Free the packet that was allocated by av_read_frame
69+
av_free_packet(&pPacket);
70+
}
71+
72+
return true;
73+
}
74+
75+
int Renderer::wait()
76+
{
77+
return pthread_join(mThread, NULL);
78+
}
79+
80+
void Renderer::stop()
81+
{
82+
mQueue->abort();
83+
__android_log_print(ANDROID_LOG_INFO, TAG, "waiting on end of renderer thread");
84+
int ret = -1;
85+
if((ret = wait()) != 0) {
86+
__android_log_print(ANDROID_LOG_ERROR, TAG, "Couldn't cancel renderer: %i", ret);
87+
return;
88+
}
89+
}

jni/libmediaplayer/renderer.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef FFMPEG_RENDERER_H
22
#define FFMPEG_RENDERER_H
33

4+
#include <jni.h>
45
#include <pthread.h>
56

67
#include "packetqueue.h"
@@ -10,6 +11,20 @@ class Renderer
1011
public:
1112
Renderer();
1213
~Renderer();
14+
15+
bool init(JNIEnv *env, jobject jsurface);
16+
PacketQueue* queue();
17+
bool startAsync(const char* err);
18+
int wait();
19+
void stop();
20+
21+
private:
22+
PacketQueue* mQueue;
23+
pthread_t mThread;
24+
bool mRendering;
25+
26+
bool render(void* ptr);
27+
static void* startRendering(void* ptr);
1328
};
1429

1530
#endif //FFMPEG_DECODER_H

0 commit comments

Comments
 (0)