Subversion Repositories Kolibri OS

Rev

Rev 5372 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | 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 "winlib/winlib.h"
  9. #include "fplay.h"
  10.  
  11. extern uint32_t  hw2d ;
  12.  
  13. #if 0
  14. #define FUTEX_INIT      0
  15. #define FUTEX_DESTROY   1
  16. #define FUTEX_WAIT      2
  17. #define FUTEX_WAKE      3
  18.  
  19. int __fastcall mutex_init(mutex_t *mutex)
  20. {
  21.     unsigned int handle;
  22.  
  23.     mutex->lock = 0;
  24.  
  25.     asm volatile(
  26.     "int $0x40\t"
  27.     :"=a"(handle)
  28.     :"a"(77),"b"(FUTEX_INIT),"c"(mutex));
  29.     mutex->handle = handle;
  30.  
  31.     return handle;
  32. };
  33.  
  34. int __fastcall mutex_destroy(mutex_t *mutex)
  35. {
  36.     int retval;
  37.  
  38.     asm volatile(
  39.     "int $0x40\t"
  40.     :"=a"(retval)
  41.     :"a"(77),"b"(FUTEX_DESTROY),"c"(mutex->handle));
  42.  
  43.     return retval;
  44. };
  45.  
  46. #define exchange_acquire(ptr, new) \
  47.   __atomic_exchange_4((ptr), (new), __ATOMIC_ACQUIRE)
  48.  
  49. #define exchange_release(ptr, new) \
  50.   __atomic_exchange_4((ptr), (new), __ATOMIC_RELEASE)
  51.  
  52. void __fastcall mutex_lock(mutex_t *mutex)
  53. {
  54.     int tmp;
  55.  
  56.     if( __sync_fetch_and_add(&mutex->lock, 1) == 0)
  57.         return;
  58.  
  59.     while (exchange_acquire (&mutex->lock, 2) != 0)
  60.     {
  61.         asm volatile(
  62.         "int $0x40\t"
  63.         :"=a"(tmp)
  64.         :"a"(77),"b"(FUTEX_WAIT),
  65.         "c"(mutex->handle),"d"(2),"S"(0));
  66.    }
  67. }
  68.  
  69. int __fastcall mutex_trylock (mutex_t *mutex)
  70. {
  71.   int zero = 0;
  72.  
  73.   return __atomic_compare_exchange_4(&mutex->lock, &zero, 1,0,__ATOMIC_ACQUIRE,__ATOMIC_RELAXED);
  74. }
  75.  
  76. void  __fastcall mutex_unlock(mutex_t *mutex)
  77. {
  78.     int prev;
  79.  
  80.     prev = exchange_release (&mutex->lock, 0);
  81.  
  82.     if (prev != 1)
  83.     {
  84.         asm volatile(
  85.         "int $0x40\t"
  86.         :"=a"(prev)
  87.         :"a"(77),"b"(FUTEX_WAKE),
  88.         "c"(mutex->handle),"d"(1));
  89.     };
  90. };
  91. #endif
  92.  
  93. int64_t _lseeki64(int fd, int64_t offset,  int origin )
  94. {
  95.     int off = offset;
  96.     return lseek(fd, off, origin);
  97. }
  98.  
  99. int put_packet(queue_t *q, AVPacket *pkt)
  100. {
  101.     AVPacketList *q_pkt;
  102.  
  103.     /* duplicate the packet */
  104. //    if (av_dup_packet(pkt) < 0)
  105. //        return -1;
  106.  
  107.     q_pkt = av_malloc(sizeof(AVPacketList));
  108.     if (!q_pkt)
  109.         return -1;
  110.  
  111.     q_pkt->pkt = *pkt;
  112.     q_pkt->next = NULL;
  113.  
  114.     mutex_lock(&q->lock);
  115.  
  116.     if (!q->last_pkt)
  117.         q->first_pkt = q_pkt;
  118.     else
  119.         q->last_pkt->next = q_pkt;
  120.  
  121.     q->last_pkt = q_pkt;
  122.     q->size += q_pkt->pkt.size + sizeof(*q_pkt);
  123.     q->count++;
  124.  
  125.     mutex_unlock(&q->lock);
  126.  
  127.     return 0;
  128. }
  129.  
  130. int get_packet(queue_t *q, AVPacket *pkt)
  131. {
  132.     AVPacketList *q_pkt;
  133.     int ret = 0;
  134.  
  135.     mutex_lock(&q->lock);
  136.  
  137.     q_pkt = q->first_pkt;
  138.     if (q_pkt)
  139.     {
  140.         q->first_pkt = q_pkt->next;
  141.         if (!q->first_pkt)
  142.             q->last_pkt = NULL;
  143.  
  144.         q->count--;
  145.         q->size -= q_pkt->pkt.size + sizeof(*q_pkt);
  146.         *pkt = q_pkt->pkt;
  147.         av_free(q_pkt);
  148.         ret = 1;
  149.     };
  150.  
  151.     mutex_unlock(&q->lock);
  152.  
  153.     return ret;
  154. }
  155.  
  156. void blit_raw(ctx_t *ctx, void *raw, int x, int y, int w, int h, int pitch)
  157. {
  158.     int *dst;
  159.     int *src = raw;
  160.     int i, j;
  161.  
  162.     dst = ctx->pixmap_data;
  163.     dst+=  y * ctx->pixmap_pitch/4 + x;
  164.  
  165.     for(i=0; i < h; i++)
  166.     {
  167.         for(j = 0; j < w; j++)
  168.             dst[j] = src[j];
  169.         dst+= ctx->pixmap_pitch/4;
  170.         src+= pitch/4;
  171.     };
  172. };
  173.