@@ -102,6 +102,9 @@ public class MediaLoader {
102102 private SceneRenderer sceneRenderer ;
103103 // The displaySurface is configured after both GL initialization and media loading.
104104 private Surface [] decodeSurface = new Surface [MAX_SURFACE_NUM + MAX_CATCHUP_SURFACE_NUM ];
105+ private Pair <Integer , Surface > decoder_surface = null ;
106+ private Pair <Integer , Surface > decoder_surface_cu = null ;
107+ private Pair <Integer , Surface > display_surface = null ;
105108 private Surface displaySurface ;
106109
107110 // The actual work of loading media happens on a background thread.
@@ -200,80 +203,80 @@ private synchronized void displayWhenReady() {
200203 }
201204 // The important methods here are the setSurface & lockCanvas calls. These will have to happen
202205 // after the GLView is created.
203- if (mediaPlayer != null && sceneRenderer .decode_surface_ready ) {
204- // 1. create decode surfaces and set them to native player.
205- for (int i =0 ;i <MAX_SURFACE_NUM ;i ++){
206- Pair <Integer , Surface > decoder_surface = sceneRenderer .createDecodeSurface (
207- mediaPlayer .mConfig .maxVideoDecodeWidth , mediaPlayer .mConfig .maxVideoDecodeHeight , i );
208- Log .i (TAG , "Complete to create one decode surface! surface id is " + i );
209- mediaPlayer .SetDecodeSurface (decoder_surface .second , decoder_surface .first , i );//set surface
210- Log .i (TAG , "ready to set decode surface!" );
211- decodeSurface [i ] = decoder_surface .second ;
212- Log .i (TAG , "decode id in java " + decoder_surface .first );
213- }
214- for (int i =MAX_SURFACE_NUM ;i <MAX_CATCHUP_SURFACE_NUM + MAX_SURFACE_NUM ;i ++){
215- Pair <Integer , Surface > decoder_surface = sceneRenderer .createDecodeSurface (
216- mediaPlayer .mConfig .maxCatchupWidth , mediaPlayer .mConfig .maxCatchupHeight , i );
217- Log .i (TAG , "Complete to create one catch-up decode surface! surface id is " + i );
218- mediaPlayer .SetDecodeSurface (decoder_surface .second , decoder_surface .first , i );//set surface
219- Log .i (TAG , "ready to set decode surface!" );
220- decodeSurface [i ] = decoder_surface .second ;
221- Log .i (TAG , "decode id in java " + decoder_surface .first );
222- }
223- // 2. create native player and get display width and height and projection format
224- int ret = mediaPlayer .Create ("./config.xml" );
225- if (ret != 0 )
226- {
227- Log .e (TAG , "native media player create failed!" );
228- return ;
229- }
230- // 3. create mesh according to PF
231- int stereoFormat = Mesh .MEDIA_MONOSCOPIC ;
232- Mesh .MeshParams params = new Mesh .MeshParams ();
233- int projFormat = mediaPlayer .GetProjectionFormat ();
234- Log .i (TAG , "pf is " + projFormat );
235- if (projFormat == PF_CUBEMAP ) {
236- mesh = CubeMapMesh .Create (params , context );
237- Log .i (TAG , "Create cubemap mesh!" );
238- }
239- else {
240- params .radius = SPHERE_RADIUS_METERS ;
241- params .latitudes = DEFAULT_SPHERE_ROWS ;
242- params .longitudes = DEFAULT_SPHERE_COLUMNS ;
243- params .vFOV = DEFAULT_SPHERE_VERTICAL_DEGREES ;
244- params .hFOV = DEFAULT_SPHERE_HORIZONTAL_DEGREES ;
245- params .mediaFormat = stereoFormat ;
246- mesh = ERPMesh .Create (params );
247- Log .i (TAG , "Create ERP mesh!" );
248- if (projFormat != PF_ERP ) {
249- Log .e (TAG , "Projection format is invalid! Default is ERP format!" );
206+ if (mediaPlayer .mConfig != null && sceneRenderer .decode_surface_ready ) {
207+ synchronized (this ) {
208+ // 1. create decode surfaces and set them to native player.
209+ for (int i = 0 ; i < MAX_SURFACE_NUM ; i ++) {
210+ decoder_surface = sceneRenderer .createDecodeSurface (
211+ mediaPlayer .mConfig .maxVideoDecodeWidth , mediaPlayer .mConfig .maxVideoDecodeHeight , i );
212+ Log .i (TAG , "Complete to create one decode surface! surface id is " + i );
213+ mediaPlayer .SetDecodeSurface (decoder_surface .second , decoder_surface .first , i );//set surface
214+ Log .i (TAG , "ready to set decode surface!" );
215+ decodeSurface [i ] = decoder_surface .second ;
216+ Log .i (TAG , "decode id in java " + decoder_surface .first );
250217 }
218+ for (int i = MAX_SURFACE_NUM ; i < MAX_CATCHUP_SURFACE_NUM + MAX_SURFACE_NUM ; i ++) {
219+ decoder_surface_cu = sceneRenderer .createDecodeSurface (
220+ mediaPlayer .mConfig .maxCatchupWidth , mediaPlayer .mConfig .maxCatchupHeight , i );
221+ Log .i (TAG , "Complete to create one catch-up decode surface! surface id is " + i );
222+ mediaPlayer .SetDecodeSurface (decoder_surface_cu .second , decoder_surface_cu .first , i );//set surface
223+ Log .i (TAG , "ready to set decode surface!" );
224+ decodeSurface [i ] = decoder_surface_cu .second ;
225+ Log .i (TAG , "decode id in java " + decoder_surface_cu .first );
226+ }
227+ // 2. create native player and get display width and height and projection format
228+ int ret = mediaPlayer .Create ("./config.xml" );
229+ if (ret != 0 ) {
230+ Log .e (TAG , "native media player create failed!" );
231+ return ;
232+ }
233+ // 3. create mesh according to PF
234+ int stereoFormat = Mesh .MEDIA_MONOSCOPIC ;
235+ Mesh .MeshParams params = new Mesh .MeshParams ();
236+ int projFormat = mediaPlayer .GetProjectionFormat ();
237+ Log .i (TAG , "pf is " + projFormat );
238+ if (projFormat == PF_CUBEMAP ) {
239+ mesh = CubeMapMesh .Create (params , context );
240+ Log .i (TAG , "Create cubemap mesh!" );
241+ } else {
242+ params .radius = SPHERE_RADIUS_METERS ;
243+ params .latitudes = DEFAULT_SPHERE_ROWS ;
244+ params .longitudes = DEFAULT_SPHERE_COLUMNS ;
245+ params .vFOV = DEFAULT_SPHERE_VERTICAL_DEGREES ;
246+ params .hFOV = DEFAULT_SPHERE_HORIZONTAL_DEGREES ;
247+ params .mediaFormat = stereoFormat ;
248+ mesh = ERPMesh .Create (params );
249+ Log .i (TAG , "Create ERP mesh!" );
250+ if (projFormat != PF_ERP ) {
251+ Log .e (TAG , "Projection format is invalid! Default is ERP format!" );
252+ }
253+ }
254+ // 4. get width / height and create display surface and set it to native player
255+ int displayWidth = mediaPlayer .GetWidth ();
256+ int displayHeight = mediaPlayer .GetHeight ();
257+ if (projFormat == PF_ERP ) {
258+ sceneRenderer .displayTexId = Utils .glCreateTextureFor2D (mediaPlayer .GetWidth (), mediaPlayer .GetHeight ());
259+ Log .i (TAG , "ERP Display texture id is " + sceneRenderer .displayTexId );
260+ } else if (projFormat == PF_CUBEMAP ) {
261+ sceneRenderer .displayTexId = Utils .glCreateTextureForCube (mediaPlayer .GetWidth (), mediaPlayer .GetHeight ());
262+ Log .i (TAG , "Cubemap Display texture id is " + sceneRenderer .displayTexId );
263+ } else {
264+ sceneRenderer .displayTexId = 0 ;
265+ Log .e (TAG , "Projection format is invalid! displayer texture id is set to zero!" );
266+ }
267+ sceneRenderer .displayTexture = new SurfaceTexture (sceneRenderer .displayTexId );
268+ checkGlError ();
269+ Log .i (TAG , "display width is " + displayWidth + " display height is " + displayHeight );
270+ display_surface = sceneRenderer .createDisplaySurface (
271+ displayWidth , displayHeight , mesh );
272+ Log .i (TAG , "ready to create display surface" );
273+ mediaPlayer .SetDisplaySurface (display_surface .first );
274+
275+ displaySurface = display_surface .second ;
276+ // 4. start native player thread
277+ Log .i (TAG , "start to start!" );
278+ mediaPlayer .Start ();
251279 }
252- // 4. get width / height and create display surface and set it to native player
253- int displayWidth = mediaPlayer .GetWidth ();
254- int displayHeight = mediaPlayer .GetHeight ();
255- if (projFormat == PF_ERP ) {
256- sceneRenderer .displayTexId = Utils .glCreateTextureFor2D (mediaPlayer .GetWidth (), mediaPlayer .GetHeight ());
257- Log .i (TAG , "ERP Display texture id is " + sceneRenderer .displayTexId );
258- }else if (projFormat == PF_CUBEMAP ) {
259- sceneRenderer .displayTexId = Utils .glCreateTextureForCube (mediaPlayer .GetWidth (), mediaPlayer .GetHeight ());
260- Log .i (TAG , "Cubemap Display texture id is " + sceneRenderer .displayTexId );
261- }else {
262- sceneRenderer .displayTexId = 0 ;
263- Log .e (TAG , "Projection format is invalid! displayer texture id is set to zero!" );
264- }
265- sceneRenderer .displayTexture = new SurfaceTexture (sceneRenderer .displayTexId );
266- checkGlError ();
267- Log .i (TAG , "display width is " + displayWidth + " display height is " + displayHeight );
268- Pair <Integer , Surface > display_surface = sceneRenderer .createDisplaySurface (
269- displayWidth , displayHeight , mesh );
270- Log .i (TAG , "ready to create display surface" );
271- mediaPlayer .SetDisplaySurface (display_surface .first );
272-
273- displaySurface = display_surface .second ;
274- // 4. start native player thread
275- Log .i (TAG , "start to start!" );
276- mediaPlayer .Start ();
277280 }else
278281 {
279282 Log .e (TAG , "media player is invalid!" );
0 commit comments