kolibrios/contrib/media/fplay/fplay.h
Sergey Semyonov (Serge) 798707fd38 Fplay: reorder decoded frames when needed
git-svn-id: svn://kolibrios.org@6135 a494cfbc-eb01-0410-851d-a64ba20cac60
2016-02-04 14:44:22 +00:00

188 lines
4.5 KiB
C

#include <libsync.h>
#include <pixlib3.h>
#include "list.h"
#define BLACK_MAGIC_SOUND
#define BLACK_MAGIC_VIDEO
typedef unsigned int color_t;
typedef unsigned int count_t;
typedef struct render render_t;
typedef struct vstate vst_t;
#define HAS_LEFT (1<<0)
#define HAS_TOP (1<<1)
#define HAS_RIGHT (1<<2)
#define HAS_BOTTOM (1<<3)
typedef struct
{
struct list_head list;
enum AVPixelFormat format;
AVPicture picture;
planar_t* planar;
int is_hw_pic;
int index;
double pts;
double pkt_pts;
double pkt_dts;
volatile int ready;
}vframe_t;
struct render
{
vst_t *vst;
uint32_t caps;
uint32_t ctx_width;
uint32_t ctx_height;
uint32_t win_width;
uint32_t win_height;
rect_t rc_client;
rect_t rcvideo;
rect_t rcleft;
rect_t rctop;
rect_t rcright;
rect_t rcbottom;
uint32_t layout;
bitmap_t *bitmap[4];
bitmap_t *last_bitmap;
uint32_t ctx_format;
int target;
window_t *win;
enum{
EMPTY, INIT }state;
enum win_state win_state;
void (*draw)(render_t *render, vframe_t *vframe);
};
enum player_state
{
CLOSED = 0,
PREPARE,
STOP,
PAUSE,
PLAY,
REWIND,
PLAY_2_STOP,
PLAY_2_PAUSE,
PAUSE_2_PLAY,
REWIND_2_PLAY,
};
#define ID_PLAY 100
#define ID_STOP 101
#define ID_PROGRESS 102
#define ID_VOL_LEVEL 103
#define ID_VOL_CTRL 104
typedef struct
{
mutex_t lock;
char *buffer;
int count;
}astream_t;
typedef struct
{
unsigned int code;
unsigned int sender;
unsigned int stream;
unsigned int offset;
unsigned int size;
unsigned int unused[2];
}SND_EVENT;
typedef struct {
AVPacketList *first_pkt;
AVPacketList *last_pkt;
int size;
int count;
mutex_t lock;
} queue_t;
int put_packet(queue_t *q, AVPacket *pkt);
int get_packet(queue_t *q, AVPacket *pkt);
#define HWDEC_NUM_SURFACES 16
struct vstate
{
AVFormatContext *fCtx; /* format context */
AVCodecContext *vCtx; /* video decoder context */
AVCodecContext *aCtx; /* audio decoder context */
AVCodec *vCodec; /* video codec */
AVCodec *aCodec; /* audio codec */
int vStream; /* video stream index */
int aStream; /* audio stream index */
queue_t q_video; /* video packets queue */
queue_t q_audio; /* audio packets queue */
mutex_t gpu_lock; /* gpu access lock. libdrm not yet thread safe :( */
mutex_t decoder_lock;
mutex_t input_lock;
mutex_t output_lock;
struct list_head input_list;
struct list_head output_list;
vframe_t *decoder_frame;
void *hwCtx; /* hardware context */
int hwdec:1; /* hardware decoder */
int blit_bitmap:1; /* hardware RGBA blitter */
int blit_texture:1; /* hardware RGBA blit and scale */
int blit_planar:1; /* hardbare YUV blit and scale */
int frame_reorder:1;
};
#define DECODER_THREAD 1
#define AUDIO_THREAD 2
#define VIDEO_THREAD 4
extern int threads_running;
extern astream_t astream;
extern AVRational video_time_base;
render_t *create_render(vst_t *vst, window_t *win, uint32_t flags);
void destroy_render(render_t *render);
int init_render(render_t *render, int width, int height);
void render_adjust_size(render_t *render, window_t *win);
void render_set_size(render_t *render, int width, int height);
void render_draw_client(render_t *render);
int fplay_init_context(vst_t *vst);
int init_audio(int format);
int audio_thread(void *param);
void set_audio_volume(int left, int right);
int init_video(vst_t* vst);
int video_thread(void *param);
void decoder(vst_t *vst);
int decode_video(vst_t* vst);
int decode_audio(AVCodecContext *ctx, queue_t *qa);
double get_master_clock(void);
static inline void GetNotify(void *event)
{
__asm__ __volatile__ (
"int $0x40"
::"a"(68),"b"(14),"c"(event));
}
void va_create_planar(vst_t *vst, vframe_t *vframe);
int init_fontlib();
char *get_moviefile();