Subversion Repositories Kolibri OS

Rev

Rev 5021 | Rev 5603 | 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. void mutex_lock(volatile uint32_t *val)
  14. {
  15.     uint32_t tmp;
  16.  
  17.     __asm__ __volatile__ (
  18. "0:\n\t"
  19.     "mov %0, %1\n\t"
  20.     "testl %1, %1\n\t"
  21.     "jz 1f\n\t"
  22.  
  23.     "movl $68, %%eax\n\t"
  24.     "movl $1,  %%ebx\n\t"
  25.     "int  $0x40\n\t"
  26.     "jmp 0b\n\t"
  27. "1:\n\t"
  28.     "incl %1\n\t"
  29.     "xchgl %0, %1\n\t"
  30.     "testl %1, %1\n\t"
  31.     "jnz 0b\n"
  32.     : "+m" (*val), "=&r"(tmp)
  33.     ::"eax","ebx" );
  34. }
  35.  
  36.  
  37. int64_t _lseeki64(int fd, int64_t offset,  int origin )
  38. {
  39.     int off = offset;
  40.     return lseek(fd, off, origin);
  41. }
  42.  
  43.  
  44. int put_packet(queue_t *q, AVPacket *pkt)
  45. {
  46.     AVPacketList *q_pkt;
  47.  
  48.     /* duplicate the packet */
  49. //    if (av_dup_packet(pkt) < 0)
  50. //        return -1;
  51.  
  52.     q_pkt = av_malloc(sizeof(AVPacketList));
  53.     if (!q_pkt)
  54.         return -1;
  55.  
  56.     q_pkt->pkt = *pkt;
  57.     q_pkt->next = NULL;
  58.  
  59.     mutex_lock(&q->lock);
  60.  
  61.     if (!q->last_pkt)
  62.         q->first_pkt = q_pkt;
  63.     else
  64.         q->last_pkt->next = q_pkt;
  65.  
  66.     q->last_pkt = q_pkt;
  67.     q->size += q_pkt->pkt.size + sizeof(*q_pkt);
  68.     q->count++;
  69.  
  70.     mutex_unlock(&q->lock);
  71.  
  72.     return 0;
  73. }
  74.  
  75. int get_packet(queue_t *q, AVPacket *pkt)
  76. {
  77.     AVPacketList *q_pkt;
  78.     int ret = 0;
  79.  
  80.     mutex_lock(&q->lock);
  81.  
  82.     q_pkt = q->first_pkt;
  83.     if (q_pkt)
  84.     {
  85.         q->first_pkt = q_pkt->next;
  86.         if (!q->first_pkt)
  87.             q->last_pkt = NULL;
  88.  
  89.         q->count--;
  90.         q->size -= q_pkt->pkt.size + sizeof(*q_pkt);
  91.         *pkt = q_pkt->pkt;
  92.         av_free(q_pkt);
  93.         ret = 1;
  94.     };
  95.  
  96.     mutex_unlock(&q->lock);
  97.  
  98.     return ret;
  99. }
  100.  
  101. void blit_raw(ctx_t *ctx, void *raw, int x, int y, int w, int h, int pitch)
  102. {
  103.     int *dst;
  104.     int *src = raw;
  105.     int i, j;
  106.  
  107.     dst = ctx->pixmap_data;
  108.     dst+=  y * ctx->pixmap_pitch/4 + x;
  109.  
  110.     for(i=0; i < h; i++)
  111.     {
  112.         for(j = 0; j < w; j++)
  113.             dst[j] = src[j];
  114.         dst+= ctx->pixmap_pitch/4;
  115.         src+= pitch/4;
  116.     };
  117. };
  118.