1
+ #include < android/log.h>
2
+
1
3
extern " C" {
2
4
3
5
#include " libavcodec/avcodec.h"
4
6
#include " libavformat/avformat.h"
5
7
6
8
}
7
9
10
+ #include " output.h"
8
11
#include " renderer.h"
9
12
13
+ #define TAG " FFMpegRenderer"
14
+
10
15
Renderer::Renderer ()
11
16
{
17
+ mQueue = new PacketQueue ();
12
18
}
13
19
14
20
Renderer::~Renderer ()
15
21
{
16
22
}
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
+ }
0 commit comments