Subversion Repositories Kolibri OS

Rev

Rev 6121 | Rev 6135 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1.  
  2. #include <libsync.h>
  3. #include <pixlib3.h>
  4. #include "list.h"
  5.  
  6. #define BLACK_MAGIC_SOUND
  7. #define BLACK_MAGIC_VIDEO
  8.  
  9. typedef unsigned int color_t;
  10. typedef unsigned int count_t;
  11.  
  12. typedef struct render  render_t;
  13. typedef struct vstate vst_t;
  14.  
  15. #define HAS_LEFT        (1<<0)
  16. #define HAS_TOP         (1<<1)
  17. #define HAS_RIGHT       (1<<2)
  18. #define HAS_BOTTOM      (1<<3)
  19.  
  20. typedef struct
  21. {
  22.     struct list_head list;
  23.     enum AVPixelFormat format;
  24.     AVPicture     picture;
  25.     planar_t*     planar;
  26.     int           is_hw_pic;
  27.     int           index;
  28.     double        pts;
  29.     double        pkt_pts;
  30.     double        pkt_dts;
  31.     volatile int  ready;
  32. }vframe_t;
  33.  
  34. struct render
  35. {
  36.     vst_t     *vst;
  37.     uint32_t   caps;
  38.     uint32_t   ctx_width;
  39.     uint32_t   ctx_height;
  40.     uint32_t   win_width;
  41.     uint32_t   win_height;
  42.  
  43.     rect_t     rc_client;
  44.     rect_t     rcvideo;
  45.     rect_t     rcleft;
  46.     rect_t     rctop;
  47.     rect_t     rcright;
  48.     rect_t     rcbottom;
  49.  
  50.     uint32_t   layout;
  51.     bitmap_t  *bitmap[4];
  52.     bitmap_t  *last_bitmap;
  53.  
  54.     uint32_t   ctx_format;
  55.     int        target;
  56.  
  57.     window_t   *win;
  58.     enum{
  59.       EMPTY, INIT }state;
  60.     enum win_state win_state;
  61.  
  62.     void (*draw)(render_t *render, vframe_t *vframe);
  63. };
  64.  
  65. enum player_state
  66. {
  67.     CLOSED = 0,
  68.     PREPARE,
  69.     STOP,
  70.     PAUSE,
  71.     PLAY,
  72.     REWIND,
  73.     PLAY_2_STOP,
  74.     PLAY_2_PAUSE,
  75.     PAUSE_2_PLAY,
  76.     REWIND_2_PLAY,
  77. };
  78.  
  79. #define ID_PLAY             100
  80. #define ID_STOP             101
  81. #define ID_PROGRESS         102
  82. #define ID_VOL_LEVEL        103
  83. #define ID_VOL_CTRL         104
  84.  
  85. typedef struct
  86. {
  87.     mutex_t lock;
  88.     char    *buffer;
  89.     int     count;
  90. }astream_t;
  91.  
  92. typedef struct
  93. {
  94.   unsigned int  code;
  95.   unsigned int  sender;
  96.   unsigned int  stream;
  97.   unsigned int  offset;
  98.   unsigned int  size;
  99.   unsigned int  unused[2];
  100. }SND_EVENT;
  101.  
  102.  
  103. typedef struct {
  104.     AVPacketList *first_pkt;
  105.     AVPacketList *last_pkt;
  106.     int size;
  107.     int count;
  108.     mutex_t       lock;
  109. } queue_t;
  110.  
  111. int put_packet(queue_t *q, AVPacket *pkt);
  112. int get_packet(queue_t *q, AVPacket *pkt);
  113.  
  114. #define HWDEC_NUM_SURFACES  16
  115. struct vstate
  116. {
  117.     AVFormatContext *fCtx;          /* format context           */
  118.     AVCodecContext  *vCtx;          /* video decoder context    */
  119.     AVCodecContext  *aCtx;          /* audio decoder context    */
  120.     AVCodec         *vCodec;        /* video codec              */
  121.     AVCodec         *aCodec;        /* audio codec              */
  122.     int             vStream;        /* video stream index       */
  123.     int             aStream;        /* audio stream index       */
  124.  
  125.     queue_t         q_video;        /* video packets queue      */
  126.     queue_t         q_audio;        /* audio packets queue      */
  127.  
  128.     mutex_t         gpu_lock;       /* gpu access lock. libdrm not yet thread safe :( */
  129.     mutex_t         decoder_lock;
  130.  
  131.     mutex_t         input_lock;
  132.     mutex_t         output_lock;
  133.     struct list_head input_list;
  134.     struct list_head output_list;
  135.  
  136.     vframe_t       *decoder_frame;
  137.     void           *hwCtx;          /* hardware context         */
  138.     int             hwdec;          /* hardware decoder         */
  139. };
  140.  
  141.  
  142. #define DECODER_THREAD  1
  143. #define AUDIO_THREAD    2
  144. #define VIDEO_THREAD    4
  145.  
  146. extern int threads_running;
  147. extern astream_t astream;
  148. extern AVRational video_time_base;
  149.  
  150. render_t *create_render(vst_t *vst, window_t *win, uint32_t flags);
  151. void destroy_render(render_t *render);
  152. int init_render(render_t *render, int width, int height);
  153. void render_adjust_size(render_t *render, window_t *win);
  154. void render_set_size(render_t *render, int width, int height);
  155. void render_draw_client(render_t *render);
  156.  
  157. int fplay_init_context(vst_t *vst);
  158.  
  159. int init_audio(int format);
  160. int audio_thread(void *param);
  161. void set_audio_volume(int left, int right);
  162.  
  163. int init_video(vst_t* vst);
  164. int video_thread(void *param);
  165.  
  166. void decoder(vst_t *vst);
  167. int decode_video(vst_t* vst);
  168. int decode_audio(AVCodecContext  *ctx, queue_t *qa);
  169.  
  170. double get_master_clock(void);
  171.  
  172. static inline void GetNotify(void *event)
  173. {
  174.     __asm__ __volatile__ (
  175.     "int $0x40"
  176.     ::"a"(68),"b"(14),"c"(event));
  177. }
  178.  
  179. void va_create_planar(vst_t *vst, vframe_t *vframe);
  180.  
  181. int init_fontlib();
  182. char *get_moviefile();
  183.  
  184.