Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. #include <stdint.h>
  3. #include <libavcodec/avcodec.h>
  4. #include <libavformat/avformat.h>
  5. #include <libswscale/swscale.h>
  6. #include <stdio.h>
  7. #include <fcntl.h>
  8. #include "fplay.h"
  9.  
  10. extern uint32_t  hw2d ;
  11.  
  12. void mutex_lock(volatile uint32_t *val)
  13. {
  14.     uint32_t tmp;
  15.  
  16.     __asm__ __volatile__ (
  17. "0:\n\t"
  18.     "mov %0, %1\n\t"
  19.     "testl %1, %1\n\t"
  20.     "jz 1f\n\t"
  21.  
  22.     "movl $68, %%eax\n\t"
  23.     "movl $1,  %%ebx\n\t"
  24.     "int  $0x40\n\t"
  25.     "jmp 0b\n\t"
  26. "1:\n\t"
  27.     "incl %1\n\t"
  28.     "xchgl %0, %1\n\t"
  29.     "testl %1, %1\n\t"
  30.     "jnz 0b\n"
  31.     : "+m" (*val), "=&r"(tmp)
  32.     ::"eax","ebx" );
  33. }
  34.  
  35.  
  36. int64_t _lseeki64(int fd, int64_t offset,  int origin )
  37. {
  38.     int off = offset;
  39.     return lseek(fd, off, origin);
  40. }
  41.  
  42.  
  43. int put_packet(queue_t *q, AVPacket *pkt)
  44. {
  45.     AVPacketList *q_pkt;
  46.  
  47.     /* duplicate the packet */
  48.     if (av_dup_packet(pkt) < 0)
  49.         return -1;
  50.  
  51.     q_pkt = av_malloc(sizeof(AVPacketList));
  52.     if (!q_pkt)
  53.         return -1;
  54.  
  55.     q_pkt->pkt = *pkt;
  56.     q_pkt->next = NULL;
  57.  
  58.     mutex_lock(&q->lock);
  59.  
  60.     if (!q->last_pkt)
  61.         q->first_pkt = q_pkt;
  62.     else
  63.         q->last_pkt->next = q_pkt;
  64.  
  65.     q->last_pkt = q_pkt;
  66.     q->size += q_pkt->pkt.size + sizeof(*q_pkt);
  67.     q->count++;
  68.  
  69.     mutex_unlock(&q->lock);
  70.  
  71.     return 0;
  72. }
  73.  
  74. int get_packet(queue_t *q, AVPacket *pkt)
  75. {
  76.     AVPacketList *q_pkt;
  77.     int ret = 0;
  78.  
  79.     mutex_lock(&q->lock);
  80.  
  81.     q_pkt = q->first_pkt;
  82.     if (q_pkt)
  83.     {
  84.         q->first_pkt = q_pkt->next;
  85.         if (!q->first_pkt)
  86.             q->last_pkt = NULL;
  87.  
  88.         q->count--;
  89.         q->size -= q_pkt->pkt.size + sizeof(*q_pkt);
  90.         *pkt = q_pkt->pkt;
  91.         av_free(q_pkt);
  92.         ret = 1;
  93.     };
  94.  
  95.     mutex_unlock(&q->lock);
  96.  
  97.     return ret;
  98. }
  99.