emotion/generic/vlc: VLC needs to write data somewhere.
authorantognolli <antognolli>
Mon, 3 Oct 2011 18:19:48 +0000 (18:19 +0000)
committerantognolli <antognolli@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 3 Oct 2011 18:19:48 +0000 (18:19 +0000)
It seems that depending on the system, vlc can't use a NULL pointer to
the pixels where it should write its data.

So a small amount of memory should be allocated and passed to its
rendering callbacks (specifically, the lock callback) when the file is
being opened and decoded for the first time. Then this memory can be
freed, since the real rendering will happen on the shared memory area.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/emotion@63777 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/generic_players/vlc/emotion_generic_vlc.c

index 4fb8ba0..848cabb 100644 (file)
@@ -35,6 +35,7 @@ struct _App {
      libvlc_event_manager_t *mevent_mgr;
      char *filename;
      char *shmname;
+     void *tmpbuffer;
      int w, h;
      int fd_read; // read commands from theads here
      int fd_write; // write commands from threads here
@@ -276,7 +277,8 @@ _display(void *data, void *id)
 static void *
 _tmp_lock(void *data, void **pixels)
 {
-   *pixels = NULL;
+   struct _App *app = data;
+   *pixels = app->tmpbuffer;
    return NULL;
 }
 
@@ -398,7 +400,7 @@ _file_set(struct _App *app)
 
    app->opening = 1;
    libvlc_video_set_format(app->mp, "RV32", DEFAULTWIDTH, DEFAULTHEIGHT, DEFAULTWIDTH * 4);
-   libvlc_video_set_callbacks(app->mp, _tmp_lock, _tmp_unlock, _tmp_display, NULL);
+   libvlc_video_set_callbacks(app->mp, _tmp_lock, _tmp_unlock, _tmp_display, app);
    app->event_mgr = libvlc_media_player_event_manager(app->mp);
    libvlc_event_attach(app->event_mgr, libvlc_MediaPlayerPositionChanged,
                       _event_cb, app);
@@ -407,6 +409,7 @@ _file_set(struct _App *app)
 
    app->mevent_mgr = libvlc_media_event_manager(app->m);
 
+   app->tmpbuffer = malloc(sizeof(char) * DEFAULTWIDTH * DEFAULTHEIGHT * 4);
    libvlc_audio_set_mute(app->mp, 1);
    libvlc_media_player_play(app->mp);
 }
@@ -560,6 +563,7 @@ release_resources:
      {
         libvlc_media_release(app->m);
         libvlc_media_player_release(app->mp);
+       free(app->tmpbuffer);
      }
 }