test: push eos media packet at the end of file 45/48845/1
authorEunhae Choi <eunhae1.choi@samsung.com>
Wed, 30 Sep 2015 12:35:43 +0000 (21:35 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Wed, 30 Sep 2015 12:35:43 +0000 (21:35 +0900)
Change-Id: Ia03187fd23e5ae3c17e4b0c34f5197092486e38e

test/legacy_player_es_push_test.c

index a75c9e64e9a7c87e60c6aa1e675617abdceb8fdf..22210cae2b7e96ee158bff1d3825fbe1303d89db 100644 (file)
@@ -270,7 +270,7 @@ static void _player_prepared_cb(void *user_data)
        LOGD("done");
 }
 
-unsigned int bytestream2nalunit(FILE *fd, unsigned char* nal)
+int bytestream2nalunit(FILE *fd, unsigned char* nal)
 {
     int nal_length = 0;
     size_t result;
@@ -316,11 +316,13 @@ unsigned int bytestream2nalunit(FILE *fd, unsigned char* nal)
     while(1)
     {
         if (feof(fd))
-            return nal_length;
+            return -1;
 
         result = fread(buffer, 1, read_size, fd);
         if(result != read_size)
         {
+            if (init == 1)
+                return -1;
             break;
         }
         val = buffer[0];
@@ -377,8 +379,36 @@ unsigned int bytestream2nalunit(FILE *fd, unsigned char* nal)
     return nal_length;
 }
 
-static void feed_video_data(appdata_s *appdata)
+static void feed_eos_data(appdata_s *appdata)
 {
+       appdata_s *ad = appdata;
+
+       LOGD("push EOS");
+
+       if (media_packet_create_alloc(ad->video_fmt, NULL, NULL, &ad->video_pkt) != MEDIA_PACKET_ERROR_NONE) {
+               LOGE("media_packet_create_alloc failed\n");
+               return;
+       }
+
+       if (media_packet_set_buffer_size(ad->video_pkt, (uint64_t)0) != MEDIA_PACKET_ERROR_NONE) {
+               LOGE("media_packet_set_buffer_size failed\n");
+               return;
+       }
+
+       media_packet_set_flags(ad->video_pkt, MEDIA_PACKET_END_OF_STREAM);
+       if (player_push_media_stream(ad->player_handle, ad->video_pkt) != PLAYER_ERROR_NONE) {
+               LOGE("fail to push media packet\n");
+       }
+
+       media_packet_destroy(ad->video_pkt);
+       ad->video_pkt = NULL;
+
+       return;
+}
+
+static bool feed_video_data(appdata_s *appdata)
+{
+       bool ret = FALSE;
        int read = 0;
        static guint64 pts = 0L;
        void *buf_data_ptr = NULL;
@@ -386,17 +416,17 @@ static void feed_video_data(appdata_s *appdata)
 
        if (media_packet_create_alloc(ad->video_fmt, NULL, NULL, &ad->video_pkt) != MEDIA_PACKET_ERROR_NONE) {
                LOGE("media_packet_create_alloc failed\n");
-               return;
+               return FALSE;
        }
 
        if (media_packet_get_buffer_data_ptr(ad->video_pkt, &buf_data_ptr) != MEDIA_PACKET_ERROR_NONE) {
                LOGE("media_packet_get_buffer_data_ptr failed\n");
-               return;
+               goto ERROR;
        }
 
        if (media_packet_set_pts(ad->video_pkt, (uint64_t)(pts/1000000)) != MEDIA_PACKET_ERROR_NONE) {
                LOGE("media_packet_set_pts failed\n");
-               return;
+               goto ERROR;
        }
 
        /* NOTE: In case of H.264 video, stream format for feeding is NAL unit.
@@ -405,39 +435,52 @@ static void feed_video_data(appdata_s *appdata)
        read = bytestream2nalunit(ad->file_src, buf_data_ptr);
        LOGD("real length = %d\n", read);
        if (read == 0) {
-               LOGD("input file read failed\n");
-               return;
+               LOGE("input file read failed\n");
+               ret = TRUE;
+               goto ERROR;
+       }
+       else if (read < 0) {
+               LOGD("push EOS");
+               media_packet_set_buffer_size(ad->video_pkt, (uint64_t)0);
+               media_packet_set_flags (ad->video_pkt, MEDIA_PACKET_END_OF_STREAM);
+               if (player_push_media_stream(ad->player_handle, ad->video_pkt) != PLAYER_ERROR_NONE) {
+                       LOGE("fail to push media packet\n");
+               }
+               goto ERROR;
        }
 
        if (media_packet_set_buffer_size(ad->video_pkt, (uint64_t)read) != MEDIA_PACKET_ERROR_NONE) {
                LOGE("media_packet_set_buffer_size failed\n");
-               return;
+               goto ERROR;
        }
 
        /* push media packet */
        player_push_media_stream(ad->player_handle, ad->video_pkt);
        pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
+       ret = TRUE;
 
+ERROR:
        /* destroy media packet after use*/
        media_packet_destroy(ad->video_pkt);
        ad->video_pkt = NULL;
-       return;
+       return ret;
 }
 
 static void feed_video_data_thread_func(void *data)
 {
-       gboolean exit = FALSE;
        appdata_s *ad = (appdata_s *)data;
 
-       while (!exit)
+       while (TRUE)
        {
                static int frame_count = 0;
 
                if (frame_count < ES_DEFAULT_NUMBER_OF_FEED) {
-                       feed_video_data(ad);
+                       if (!feed_video_data(ad))
+                               break;
                        frame_count++;
                } else {
-                       exit = TRUE;
+                       feed_eos_data(ad);
+                       break;
                }
        }
 }