嵌入式 双向链表实现视频预录(hi3518c)

来源:互联网 发布:淘宝卖什么虚拟物品好 编辑:程序博客网 时间:2024/05/22 04:48

转载注明出处:http://blog.sina.com.cn/s/blog_8795b0970101jlns.html

prerecord.h

typedef struct joseph_prerecord 

 char *ipnc_frame_buf[25];
 int ipnc_frame_buf_size[25];
 
}JOSEPH_RECORD;

typedef struct node 

 JOSEPH_RECORD joseph_prerecord_ipnc;
 struct node *next; 
 struct node *pione;
}NODE;

 

prerecord.c

#include "avserver.h" 


NODE * prerecord_node_create(void) 

 NODE *head = (NODE *)malloc(sizeof(NODE)); 
 memset(head,0,sizeof(NODE));
 head->next = NULL; 
 head->pione = NULL; 
  return head; 

void init_joseph_prerecord_ipnc(JOSEPH_RECORD *in)
{
 static int i_temp =0;
 for(i_temp = 0; i_temp< 25 ; i_temp++)
 {
  in->ipnc_frame_buf[i_temp] = NULL;
  in->ipnc_frame_buf_size[i_temp] = 0;
 }
  
}


void prerecord_node_fill(NODE *head,JOSEPH_RECORD *in)
{
 static int i_temp = 0;
 for(i_temp = 0; i_temp < 25; i_temp++)
 
  
  head->joseph_prerecord_ipnc.ipnc_frame_buf[i_temp] = (char *)malloc((in->ipnc_frame_buf_size[i_temp])*sizeof(char));
  memcpy(head->joseph_prerecord_ipnc.ipnc_frame_buf[i_temp],in->ipnc_frame_buf[i_temp],in->ipnc_frame_buf_size[i_temp]);
  head->joseph_prerecord_ipnc.ipnc_frame_buf_size[i_temp] = in->ipnc_frame_buf_size[i_temp];
 }

}

NODE * prerecord_node_insert(NODE *head,JOSEPH_RECORD *joseph_prerecord_in) 

 NODE *p = NULL;
 if(head->joseph_prerecord_ipnc.ipnc_frame_buf[0] == NULL) 
 
  prerecord_node_fill(head,joseph_prerecord_in);
  return head;
 
 else 
 
        p = (NODE *)malloc(sizeof(NODE));
        memset(p,0,sizeof(p));
  prerecord_node_fill(p,joseph_prerecord_in);
        head->pione = p; 
        p->next = head; 
        p->pione = NULL; 
       } 
  return p; 
}


void ipnc_frame_print(NODE *head) 

 NODE *q = NULL; 
 q = head; 
       static int frame_count = 0;
 static int node_count = 1;
       while(q != NULL) 
       { 
        printf("\n%s %d The %dth node : \n\n",__FUNCTION__,__LINE__,node_count++);
              for(frame_count = 0; frame_count < 25; frame_count++)
              {
         printf("%s %d The contnet of the %dth is %s \n",__FUNCTION__,__LINE__,frame_count,q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count]);               
              }
      q = q->next;
      printf("\n"); 
    
     


void ipnc_frame_save(NODE * head)
{

 FILE *fp_video;
 NODE *q = NULL; 
 q = head; 
       static int frame_count = 0;
       static int node_count = 1;
   fp_video = fopen(JOSEPH_PRERECORD_FILE_NAME, "wb");

       while(q->next != NULL) 
       { 
      q = q->next;
    }

#if 1
while(q != NULL)
{

 ///save one node
 for(frame_count = 0; frame_count < 25; frame_count++)
       {
        
        fwrite(q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count],q->joseph_prerecord_ipnc.ipnc_frame_buf_size[frame_count],1,fp_video);
  fflush(fp_video);
      }
 q = q->pione;
 node_count++;
 
 
}

fclose(fp_video);

#endif
 
}


NODE * ipnc_frame_free_node(NODE *head) 

 NODE *q = NULL;
 NODE *p = NULL;
 NODE *p_head = NULL;
       q = head;
 p_head = head;
       static int frame_count = 0;
 while(q->next != NULL) 
       { 
        q = q->next;
  p = q->pione;
    }

 if(q->next == NULL)
 {
  p->next = NULL;
  for(frame_count = 0; frame_count < 25; frame_count++)
        {
         free(q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count]);
   q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count] = NULL;
   if( q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count] == NULL )
   {
    //printf("%s %d free %dth frame buf succeed !\n",__FUNCTION__,__LINE__,frame_count);
   }
         }
   free(q);
   q = NULL;
 }
     return p_head;


void ipnc_frame_free(NODE *head) 

 NODE *q = NULL; 
       static int frame_count = 0;
 while(head != NULL) 
       { 
        q = head;
  head = head->next;
  
              for(frame_count = 0; frame_count < 25; frame_count++)
              {
         free(q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count]);
   q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count] = NULL;
   if( q->joseph_prerecord_ipnc.ipnc_frame_buf[frame_count] == NULL )
   {
    //printf("%s %d free %dth frame buf succeed !\n",__FUNCTION__,__LINE__,frame_count);
   }
              }
        free(q);
  q = NULL;
    
     

#if 0
int joseph_prerecord_video()
{

 static int frame_count = 0;
 char buf[64] = {0};
 NODE *joseph_prerecord_head = (NODE *)malloc(sizeof(NODE));
 JOSEPH_RECORD *joseph_prerecord_frame = (JOSEPH_RECORD *)malloc(sizeof(JOSEPH_RECORD));
 memset(joseph_prerecord_head,0,sizeof(NODE));
 memset(joseph_prerecord_frame,0,sizeof(JOSEPH_RECORD));

 init_joseph_prerecord_ipnc(&joseph_prerecord_head->joseph_prerecord_ipnc);
 init_joseph_prerecord_ipnc(joseph_prerecord_frame); 


 joseph_prerecord_head = prerecord_node_create();
 if ( joseph_prerecord_head != NULL)
 {
  printf("%s %d Create the list succeed !\n",__FUNCTION__,__LINE__);
  
 }

 //init joseph_prerecord_head

 //creat next node

 for(frame_count = 0; frame_count < 25; frame_count++)
 {
  memset(buf,0,64);
  sprintf(buf,"%d",(frame_count*frame_count));

  joseph_prerecord_frame->ipnc_frame_buf[frame_count] = (char *)malloc((strlen(buf))*sizeof(char));
  memset(joseph_prerecord_frame->ipnc_frame_buf[frame_count],0,strlen(joseph_prerecord_frame->ipnc_frame_buf[frame_count]));
  memcpy(joseph_prerecord_frame->ipnc_frame_buf[frame_count],buf,strlen(buf));
        //printf("%s %d The content of the buf is %s, the length is %d\n",__FUNCTION__,__LINE__,buf,strlen(joseph_prerecord_frame->ipnc_frame_buf[frame_count]));
  printf("%s %d The content of %dth frame is  is %s\n",__FUNCTION__,__LINE__,frame_count,joseph_prerecord_frame->ipnc_frame_buf[frame_count]);
 }
 
 joseph_prerecord_head = prerecord_node_insert(joseph_prerecord_head,joseph_prerecord_frame);


 for(frame_count = 0; frame_count < 25; frame_count++)
 {
  memset(buf,0,64);
  sprintf(buf,"%d",(frame_count*frame_count*frame_count));

  joseph_prerecord_frame->ipnc_frame_buf[frame_count] = (char *)malloc((strlen(buf))*sizeof(char));
  memset(joseph_prerecord_frame->ipnc_frame_buf[frame_count],0,strlen(joseph_prerecord_frame->ipnc_frame_buf[frame_count]));
  memcpy(joseph_prerecord_frame->ipnc_frame_buf[frame_count],buf,strlen(buf));
        printf("%s %d The content of the buf is %s, the length is %d\n",__FUNCTION__,__LINE__,buf,strlen(joseph_prerecord_frame->ipnc_frame_buf[frame_count]));
  printf("%s %d The content of %dth frame is  is %s\n",__FUNCTION__,__LINE__,frame_count,joseph_prerecord_frame->ipnc_frame_buf[frame_count]);
 }
 
 joseph_prerecord_head = prerecord_node_insert(joseph_prerecord_head,joseph_prerecord_frame);


 for(frame_count = 0; frame_count < 25; frame_count++)
 {
  memset(buf,0,64);
  sprintf(buf,"%d",(frame_count*frame_count*frame_count*frame_count));

  joseph_prerecord_frame->ipnc_frame_buf[frame_count] = (char *)malloc((strlen(buf))*sizeof(char));
  memset(joseph_prerecord_frame->ipnc_frame_buf[frame_count],0,strlen(joseph_prerecord_frame->ipnc_frame_buf[frame_count]));
  memcpy(joseph_prerecord_frame->ipnc_frame_buf[frame_count],buf,strlen(buf));
        printf("%s %d The content of the buf is %s, the length is %d\n",__FUNCTION__,__LINE__,buf,strlen(joseph_prerecord_frame->ipnc_frame_buf[frame_count]));
  printf("%s %d The content of %dth frame is  is %s\n",__FUNCTION__,__LINE__,frame_count,joseph_prerecord_frame->ipnc_frame_buf[frame_count]);
 }
 
 joseph_prerecord_head = prerecord_node_insert(joseph_prerecord_head,joseph_prerecord_frame);

 
 for(frame_count = 0; frame_count < 25; frame_count++)
 {

  free(joseph_prerecord_frame->ipnc_frame_buf[frame_count]);
  joseph_prerecord_frame->ipnc_frame_buf[frame_count] = NULL;
  
 }
 
 ipnc_frame_print(joseph_prerecord_head);


 ipnc_frame_free(joseph_prerecord_head);

 
 return 0;
}
#endif

原创粉丝点击