[Cvs-annodex] commit (annodex): liboggplay/trunk/src/liboggplay/Version_script.in liboggplay/trunk/src/liboggplay/oggplay.c liboggplay/trunk/src/liboggplay/oggplay_buffer.c liboggplay/trunk/src/liboggplay/oggplay_callback_info.c liboggplay/trunk/src/liboggplay/oggplay_data.c

shans nobody at lists.annodex.net
Thu Oct 26 10:45:22 UTC 2006


Update of /var/local/lib/svn/annodex (new revision 2537)

Modified files:
   liboggplay/trunk/src/liboggplay/Version_script.in
   liboggplay/trunk/src/liboggplay/oggplay.c
   liboggplay/trunk/src/liboggplay/oggplay_buffer.c
   liboggplay/trunk/src/liboggplay/oggplay_callback_info.c
   liboggplay/trunk/src/liboggplay/oggplay_data.c

Log Message:
Fixed memory problems in lock-free buffer



Modified: liboggplay/trunk/src/liboggplay/Version_script.in
===================================================================
--- liboggplay/trunk/src/liboggplay/Version_script.in	2006-10-24 08:04:25 UTC (rev 2536)
+++ liboggplay/trunk/src/liboggplay/Version_script.in	2006-10-26 10:45:20 UTC (rev 2537)
@@ -37,7 +37,7 @@
 
                 oggplay_buffer_retrieve_next;
                 oggplay_buffer_release_next;
-                oggplay_usr_buffer;
+                oggplay_use_buffer;
 
                 oggplay_callback_info_lock_item;
                 oggplay_callback_info_unlock_item;

Modified: liboggplay/trunk/src/liboggplay/oggplay.c
===================================================================
--- liboggplay/trunk/src/liboggplay/oggplay.c	2006-10-24 08:04:25 UTC (rev 2536)
+++ liboggplay/trunk/src/liboggplay/oggplay.c	2006-10-26 10:45:20 UTC (rev 2537)
@@ -64,6 +64,7 @@
   me->reader = reader;
   me->input_name = filename;
   me->decode_data = NULL;
+  me->callback_info = NULL;
   me->num_tracks = 0;
   me->all_tracks_initialised = 0;
   me->callback_period = 0;

Modified: liboggplay/trunk/src/liboggplay/oggplay_buffer.c
===================================================================
--- liboggplay/trunk/src/liboggplay/oggplay_buffer.c	2006-10-24 08:04:25 UTC (rev 2536)
+++ liboggplay/trunk/src/liboggplay/oggplay_buffer.c	2006-10-26 10:45:20 UTC (rev 2537)
@@ -66,7 +66,7 @@
   /*
    * replace the decode_data buffer for the next callback
    */
-  me->callback_info = malloc(me->num_tracks * sizeof (OggPlayCallbackInfo));
+  me->callback_info = calloc(me->num_tracks, sizeof (OggPlayCallbackInfo));
   
   /*
    * fill both mirror and list, mirror first to avoid getting inconsistencies
@@ -74,14 +74,22 @@
 
   buffer->last_filled = WRAP_INC(buffer->last_filled, buffer->buffer_size);
   
+  printf("BUFFER insert %p\n", ptr);
+                  
   buffer->buffer_mirror[buffer->last_filled] = ptr;
   buffer->buffer_list[buffer->last_filled] = ptr;
+
   
   /*
    * check for and clean up empties
    */
-  for (k = 0; i < buffer->buffer_size; k++) {
-    if (buffer->buffer_list[k] == NULL && buffer->buffer_mirror[k] != NULL) {
+  for (k = 0; k < buffer->buffer_size; k++) {
+    if 
+    (
+      (buffer->buffer_list[k] == NULL) 
+      && 
+      (buffer->buffer_mirror[k] != NULL)
+    ) {
       OggPlayCallbackInfo *ti = (OggPlayCallbackInfo *)buffer->buffer_mirror[k];
       for (i = 0; i < tracks; i++) {
         headers = oggplay_callback_info_get_headers(ti + i);
@@ -89,8 +97,13 @@
         for (j = 0; j < required; j++) {
           oggplay_callback_info_unlock_item(headers[j]);
         }
+        /* free these here, because we couldn't free them in 
+         * oggplay_callback_info_destroy for buffer mode
+         */
+        free((ti + i)->records);
       }
       free(ti);
+      buffer->buffer_mirror[k] = NULL;
     }
   }
   
@@ -141,6 +154,8 @@
     return_val[i] = next_item + i;
   }
 
+  printf("BUFFER retrieve %p\n", next_item);
+  
   return return_val;
   
 }
@@ -164,7 +179,6 @@
     return E_OGGPLAY_UNINITIALISED;
   }
 
-  free(me);
   buffer->buffer_list[buffer->last_emptied] = NULL;
   return E_OGGPLAY_OK;
 
@@ -190,9 +204,10 @@
     return E_OGGPLAY_OK;
   }
   
+
+  oggplay_set_data_callback(me, &oggplay_buffer_callback, NULL);
   me->buffer = oggplay_buffer_new_buffer(size);
 
-  oggplay_set_data_callback(me, oggplay_buffer_callback, NULL);
   for (i = 0; i < me->num_tracks; i++) {
     if (oggplay_get_track_type(me, i) == OGGZ_CONTENT_THEORA) { 
       oggplay_set_callback_num_frames(me, i, 1);

Modified: liboggplay/trunk/src/liboggplay/oggplay_callback_info.c
===================================================================
--- liboggplay/trunk/src/liboggplay/oggplay_callback_info.c	2006-10-24 08:04:25 UTC (rev 2536)
+++ liboggplay/trunk/src/liboggplay/oggplay_callback_info.c	2006-10-26 10:45:20 UTC (rev 2537)
@@ -56,6 +56,7 @@
     OggPlayCallbackInfo * track_info = me->callback_info + i;
     int                   count = 0;
     OggPlayDataHeader   * p;
+    OggPlayDataHeader   * q = NULL;
     
     (*info)[i] = track_info;
 
@@ -65,9 +66,15 @@
       track_info->records = NULL;
       continue;
     }
-    
+   
     for (p = track->data_list; p != NULL; p = p->next) {
-      count++;
+      if (p->presentation_time >= (me->target - me->callback_period)) {
+        if (q == NULL) {
+          q = p;
+        }
+        printf("%llx ", p->presentation_time);
+        count++;
+      }
     }
   
     track_info->records = malloc (count * sizeof (OggPlayDataHeader *));
@@ -77,12 +84,14 @@
     track_info->data_type = track->decoded_type;
    
     count = 0;
-    for (p = track->data_list; p != NULL; p = p->next) {
+    for (p = q; p != NULL; p = p->next) {
       track_info->records[count++] = p;
       if (p->presentation_time <= me->target) {
         track_info->required_records++;
       }
     }
+
+    printf("%d\n", track_info->required_records);
     
   }
   
@@ -99,7 +108,7 @@
 
   for (i = 0; i < me->num_tracks; i++) {
     p = info[i];
-    if (p->records != NULL)
+    if (me->buffer == NULL && p->records != NULL)
       free(p->records);
   }
 
@@ -168,6 +177,8 @@
   if (header == NULL) {
     return;
   }
+ 
+  printf("DATA lock %p %llx\n", header, header->presentation_time);
   
   header->lock = 2;
 
@@ -180,6 +191,8 @@
     return;
   }
 
+  printf("DATA unlock %p\n", header);
+  
   header->lock = 1;
 }
 

Modified: liboggplay/trunk/src/liboggplay/oggplay_data.c
===================================================================
--- liboggplay/trunk/src/liboggplay/oggplay_data.c	2006-10-24 08:04:25 UTC (rev 2536)
+++ liboggplay/trunk/src/liboggplay/oggplay_data.c	2006-10-26 10:45:20 UTC (rev 2537)
@@ -67,6 +67,8 @@
 oggplay_data_add_to_list (OggPlayDecode *decode, OggPlayDataHeader *data) {
   
   data->next = NULL;
+ 
+  printf("DATA add %p %llx\n", data, data->presentation_time);
   
   if (decode->end_of_data_list == NULL) {
     decode->data_list = data;
@@ -106,6 +108,7 @@
         if (header->next == NULL)
           decode->end_of_data_list = p;
         p->next = header->next;
+        printf("DATA free %p\n", header);
         free (header);
         header = p->next;
       }


-- 
shans



More information about the cvs-annodex mailing list