forked from KolibriOS/kolibrios
Fplay:cleanup & f77 synchronization
git-svn-id: svn://kolibrios.org@5603 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
1918b713af
commit
838b368713
@ -8,28 +8,29 @@ LD = kos32-ld
|
|||||||
CPP= kos32-g++
|
CPP= kos32-g++
|
||||||
STRIP = kos32-strip
|
STRIP = kos32-strip
|
||||||
|
|
||||||
CFLAGS = -U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fno-ident -fomit-frame-pointer
|
CFLAGS = -U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fno-ident -fomit-frame-pointer -mno-ms-bitfields
|
||||||
|
|
||||||
ARFLAG = crs
|
ARFLAG = crs
|
||||||
|
|
||||||
SDK_DIR:= $(abspath ../../sdk)
|
SDK_DIR:= $(abspath ../../sdk)
|
||||||
LIB_DIR:= $(SDK_DIR)/lib
|
LIB_DIR:= $(SDK_DIR)/lib
|
||||||
|
|
||||||
|
INCLUDES= -I. -I$(SDK_DIR)/sources/newlib/libc/include -I$(SDK_DIR)/sources/ffmpeg
|
||||||
|
INCLUDES+=-I$(SDK_DIR)/sources/freetype/include
|
||||||
|
#-I$(SDK_DIR)/sources/vaapi/libva-1.4.1
|
||||||
|
|
||||||
INCLUDES= -I. -I$(SDK_DIR)/sources/newlib/libc/include -I$(SDK_DIR)/sources/ffmpeg -I$(SDK_DIR)/sources/freetype/include
|
#DEFINES= -DDEBUG=1 -DPACKAGE_NAME=\"Fplay-vaapi\"
|
||||||
|
LIBS:= -lsync -lavdevice.dll -lavformat.dll -lavcodec.dll -lavutil.dll -lswscale.dll
|
||||||
LIBS:= -lavdevice.dll -lavformat.dll -lavcodec.dll -lavutil.dll -lswscale.dll
|
LIBS+= -lswresample.dll -lsound -lpixlib3 -lfreetype.dll -lva.dll -lgcc -lc.dll -lapp
|
||||||
LIBS+= -lswresample.dll -lsound -lpixlib3 -lfreetype.dll -lgcc -lc.dll -lapp
|
|
||||||
|
|
||||||
LIBPATH:= -L$(LIB_DIR) -L/home/autobuild/tools/win32/mingw32/lib
|
LIBPATH:= -L$(LIB_DIR) -L/home/autobuild/tools/win32/mingw32/lib
|
||||||
|
|
||||||
LDFLAGS = -static -nostdlib --stack 0x200000 -T$(SDK_DIR)/sources/newlib/app.lds --image-base 0
|
LDFLAGS = -static -nostdlib --stack 0x200000 -Map fplay.map -T$(SDK_DIR)/sources/newlib/app.lds --image-base 0
|
||||||
|
|
||||||
SOURCES = opendial.asm \
|
SOURCES = opendial.asm \
|
||||||
audio.c \
|
audio.c \
|
||||||
fplay.c \
|
fplay.c \
|
||||||
utils.c \
|
|
||||||
video.c \
|
video.c \
|
||||||
|
utils.c \
|
||||||
skin/skin.asm \
|
skin/skin.asm \
|
||||||
winlib/button.c \
|
winlib/button.c \
|
||||||
winlib/caption.c \
|
winlib/caption.c \
|
||||||
@ -40,7 +41,6 @@ SOURCES = opendial.asm \
|
|||||||
|
|
||||||
OBJECTS = $(patsubst %.asm, %.o, $(patsubst %.c, %.o, $(SOURCES)))
|
OBJECTS = $(patsubst %.asm, %.o, $(patsubst %.c, %.o, $(SOURCES)))
|
||||||
|
|
||||||
|
|
||||||
# targets
|
# targets
|
||||||
|
|
||||||
all:$(NAME)
|
all:$(NAME)
|
||||||
|
@ -22,7 +22,7 @@ volatile enum player_state player_state;
|
|||||||
volatile enum player_state decoder_state;
|
volatile enum player_state decoder_state;
|
||||||
volatile enum player_state sound_state;
|
volatile enum player_state sound_state;
|
||||||
|
|
||||||
extern volatile uint32_t driver_lock;
|
extern mutex_t driver_lock;
|
||||||
|
|
||||||
static SNDBUF hBuff;
|
static SNDBUF hBuff;
|
||||||
|
|
||||||
@ -287,14 +287,13 @@ int audio_thread(void *param)
|
|||||||
char *errstr;
|
char *errstr;
|
||||||
int active;
|
int active;
|
||||||
|
|
||||||
|
|
||||||
if((err = CreateBuffer(snd_format|PCM_RING,0, &hBuff)) != 0)
|
if((err = CreateBuffer(snd_format|PCM_RING,0, &hBuff)) != 0)
|
||||||
{
|
{
|
||||||
errstr = "Cannot create sound buffer\n\r";
|
errstr = "Cannot create sound buffer\n\r";
|
||||||
goto exit_whith_error;
|
goto exit_whith_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
SetVolume(hBuff,-1875,-1875);
|
SetVolume(hBuff,-900,-900);
|
||||||
|
|
||||||
if((err = GetBufferSize(hBuff, &buffsize)) != 0)
|
if((err = GetBufferSize(hBuff, &buffsize)) != 0)
|
||||||
{
|
{
|
||||||
@ -302,6 +301,8 @@ int audio_thread(void *param)
|
|||||||
goto exit_whith_error;
|
goto exit_whith_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__sync_or_and_fetch(&threads_running,AUDIO_THREAD);
|
||||||
|
|
||||||
resampler_size = buffsize = buffsize/2;
|
resampler_size = buffsize = buffsize/2;
|
||||||
|
|
||||||
samples = buffsize/4;
|
samples = buffsize/4;
|
||||||
@ -428,6 +429,8 @@ int audio_thread(void *param)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__sync_and_and_fetch(&threads_running,~AUDIO_THREAD);
|
||||||
|
|
||||||
StopBuffer(hBuff);
|
StopBuffer(hBuff);
|
||||||
DestroyBuffer(hBuff);
|
DestroyBuffer(hBuff);
|
||||||
|
|
||||||
|
@ -50,6 +50,9 @@ int64_t rewind_pos;
|
|||||||
|
|
||||||
int64_t stream_duration;
|
int64_t stream_duration;
|
||||||
|
|
||||||
|
int threads_running = DECODER_THREAD;
|
||||||
|
mutex_t driver_lock;
|
||||||
|
|
||||||
extern double audio_base;
|
extern double audio_base;
|
||||||
|
|
||||||
double get_audio_base()
|
double get_audio_base()
|
||||||
@ -169,6 +172,9 @@ int main( int argc, char *argv[])
|
|||||||
|
|
||||||
// printf("ctx->pix_fmt %d\n", pCodecCtx->pix_fmt);
|
// printf("ctx->pix_fmt %d\n", pCodecCtx->pix_fmt);
|
||||||
|
|
||||||
|
mutex_init(&driver_lock);
|
||||||
|
mutex_init(&q_video.lock);
|
||||||
|
mutex_init(&q_audio.lock);
|
||||||
|
|
||||||
if (aCodecCtx->channels > 0)
|
if (aCodecCtx->channels > 0)
|
||||||
aCodecCtx->request_channels = FFMIN(2, aCodecCtx->channels);
|
aCodecCtx->request_channels = FFMIN(2, aCodecCtx->channels);
|
||||||
@ -203,7 +209,7 @@ int main( int argc, char *argv[])
|
|||||||
decoder_buffer = (uint8_t*)av_mallocz(192000*2+64);
|
decoder_buffer = (uint8_t*)av_mallocz(192000*2+64);
|
||||||
if( decoder_buffer != NULL )
|
if( decoder_buffer != NULL )
|
||||||
{
|
{
|
||||||
astream.lock = 0;
|
mutex_init(&astream.lock);
|
||||||
astream.count = 0;
|
astream.count = 0;
|
||||||
astream.buffer = (char *)av_mallocz(192000*3);
|
astream.buffer = (char *)av_mallocz(192000*3);
|
||||||
if( astream.buffer != NULL )
|
if( astream.buffer != NULL )
|
||||||
@ -224,8 +230,6 @@ int main( int argc, char *argv[])
|
|||||||
if( !init_video(pCodecCtx))
|
if( !init_video(pCodecCtx))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// __asm__ __volatile__("int3");
|
|
||||||
|
|
||||||
decoder();
|
decoder();
|
||||||
|
|
||||||
// Free the YUV frame
|
// Free the YUV frame
|
||||||
@ -234,13 +238,16 @@ int main( int argc, char *argv[])
|
|||||||
|
|
||||||
//__asm__ __volatile__("int3");
|
//__asm__ __volatile__("int3");
|
||||||
|
|
||||||
// Close the codec
|
while( threads_running &
|
||||||
// avcodec_close(pCodecCtx);
|
(AUDIO_THREAD | VIDEO_THREAD))
|
||||||
|
delay(1);
|
||||||
|
|
||||||
// Close the video file
|
if(astream.lock.handle)
|
||||||
// av_close_input_file(pFormatCtx);
|
mutex_destroy(&astream.lock);
|
||||||
|
|
||||||
//__asm__ __volatile__("int3");
|
mutex_destroy(&driver_lock);
|
||||||
|
mutex_destroy(&q_video.lock);
|
||||||
|
mutex_destroy(&q_audio.lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -431,16 +438,5 @@ void decoder()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ret = 1;
|
|
||||||
|
|
||||||
while( (player_state != CLOSED) && ret)
|
|
||||||
{
|
|
||||||
ret = decode_video(pCodecCtx, &q_video);
|
|
||||||
ret |= decode_audio(aCodecCtx, &q_audio);
|
|
||||||
delay(1);
|
|
||||||
};
|
|
||||||
delay(50);
|
|
||||||
player_state = CLOSED;
|
|
||||||
delay(300);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
#include "pixlib3.h"
|
#include "pixlib3.h"
|
||||||
|
#include <libsync.h>
|
||||||
|
|
||||||
#define BLACK_MAGIC_SOUND
|
#define BLACK_MAGIC_SOUND
|
||||||
#define BLACK_MAGIC_VIDEO
|
#define BLACK_MAGIC_VIDEO
|
||||||
@ -64,11 +65,12 @@ enum player_state
|
|||||||
#define ID_VOL_LEVEL 103
|
#define ID_VOL_LEVEL 103
|
||||||
#define ID_VOL_CTRL 104
|
#define ID_VOL_CTRL 104
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
volatile uint32_t lock;
|
mutex_t lock;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
volatile uint32_t count;
|
int count;
|
||||||
}astream_t;
|
}astream_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -87,13 +89,18 @@ typedef struct {
|
|||||||
AVPacketList *last_pkt;
|
AVPacketList *last_pkt;
|
||||||
int size;
|
int size;
|
||||||
int count;
|
int count;
|
||||||
volatile uint32_t lock;
|
mutex_t lock;
|
||||||
} queue_t;
|
} queue_t;
|
||||||
|
|
||||||
int put_packet(queue_t *q, AVPacket *pkt);
|
int put_packet(queue_t *q, AVPacket *pkt);
|
||||||
int get_packet(queue_t *q, AVPacket *pkt);
|
int get_packet(queue_t *q, AVPacket *pkt);
|
||||||
|
|
||||||
|
|
||||||
|
#define DECODER_THREAD 1
|
||||||
|
#define AUDIO_THREAD 2
|
||||||
|
#define VIDEO_THREAD 4
|
||||||
|
|
||||||
|
extern int threads_running;
|
||||||
extern astream_t astream;
|
extern astream_t astream;
|
||||||
extern AVRational video_time_base;
|
extern AVRational video_time_base;
|
||||||
|
|
||||||
@ -120,12 +127,6 @@ double get_master_clock(void);
|
|||||||
|
|
||||||
int create_thread(int (*proc)(void *param), void *param, int stack_size);
|
int create_thread(int (*proc)(void *param), void *param, int stack_size);
|
||||||
|
|
||||||
void mutex_lock(volatile uint32_t *val);
|
|
||||||
|
|
||||||
static inline void mutex_unlock(volatile uint32_t *val)
|
|
||||||
{
|
|
||||||
*val = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void GetNotify(void *event)
|
static inline void GetNotify(void *event)
|
||||||
{
|
{
|
||||||
|
@ -10,29 +10,85 @@
|
|||||||
|
|
||||||
extern uint32_t hw2d ;
|
extern uint32_t hw2d ;
|
||||||
|
|
||||||
void mutex_lock(volatile uint32_t *val)
|
#if 0
|
||||||
|
#define FUTEX_INIT 0
|
||||||
|
#define FUTEX_DESTROY 1
|
||||||
|
#define FUTEX_WAIT 2
|
||||||
|
#define FUTEX_WAKE 3
|
||||||
|
|
||||||
|
int __fastcall mutex_init(mutex_t *mutex)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
unsigned int handle;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
mutex->lock = 0;
|
||||||
"0:\n\t"
|
|
||||||
"mov %0, %1\n\t"
|
|
||||||
"testl %1, %1\n\t"
|
|
||||||
"jz 1f\n\t"
|
|
||||||
|
|
||||||
"movl $68, %%eax\n\t"
|
asm volatile(
|
||||||
"movl $1, %%ebx\n\t"
|
"int $0x40\t"
|
||||||
"int $0x40\n\t"
|
:"=a"(handle)
|
||||||
"jmp 0b\n\t"
|
:"a"(77),"b"(FUTEX_INIT),"c"(mutex));
|
||||||
"1:\n\t"
|
mutex->handle = handle;
|
||||||
"incl %1\n\t"
|
|
||||||
"xchgl %0, %1\n\t"
|
return handle;
|
||||||
"testl %1, %1\n\t"
|
};
|
||||||
"jnz 0b\n"
|
|
||||||
: "+m" (*val), "=&r"(tmp)
|
int __fastcall mutex_destroy(mutex_t *mutex)
|
||||||
::"eax","ebx" );
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
"int $0x40\t"
|
||||||
|
:"=a"(retval)
|
||||||
|
:"a"(77),"b"(FUTEX_DESTROY),"c"(mutex->handle));
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define exchange_acquire(ptr, new) \
|
||||||
|
__atomic_exchange_4((ptr), (new), __ATOMIC_ACQUIRE)
|
||||||
|
|
||||||
|
#define exchange_release(ptr, new) \
|
||||||
|
__atomic_exchange_4((ptr), (new), __ATOMIC_RELEASE)
|
||||||
|
|
||||||
|
void __fastcall mutex_lock(mutex_t *mutex)
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
if( __sync_fetch_and_add(&mutex->lock, 1) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (exchange_acquire (&mutex->lock, 2) != 0)
|
||||||
|
{
|
||||||
|
asm volatile(
|
||||||
|
"int $0x40\t"
|
||||||
|
:"=a"(tmp)
|
||||||
|
:"a"(77),"b"(FUTEX_WAIT),
|
||||||
|
"c"(mutex->handle),"d"(2),"S"(0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __fastcall mutex_trylock (mutex_t *mutex)
|
||||||
|
{
|
||||||
|
int zero = 0;
|
||||||
|
|
||||||
|
return __atomic_compare_exchange_4(&mutex->lock, &zero, 1,0,__ATOMIC_ACQUIRE,__ATOMIC_RELAXED);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __fastcall mutex_unlock(mutex_t *mutex)
|
||||||
|
{
|
||||||
|
int prev;
|
||||||
|
|
||||||
|
prev = exchange_release (&mutex->lock, 0);
|
||||||
|
|
||||||
|
if (prev != 1)
|
||||||
|
{
|
||||||
|
asm volatile(
|
||||||
|
"int $0x40\t"
|
||||||
|
:"=a"(prev)
|
||||||
|
:"a"(77),"b"(FUTEX_WAKE),
|
||||||
|
"c"(mutex->handle),"d"(1));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
int64_t _lseeki64(int fd, int64_t offset, int origin )
|
int64_t _lseeki64(int fd, int64_t offset, int origin )
|
||||||
{
|
{
|
||||||
@ -40,7 +96,6 @@ int64_t _lseeki64(int fd, int64_t offset, int origin )
|
|||||||
return lseek(fd, off, origin);
|
return lseek(fd, off, origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int put_packet(queue_t *q, AVPacket *pkt)
|
int put_packet(queue_t *q, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
AVPacketList *q_pkt;
|
AVPacketList *q_pkt;
|
||||||
|
@ -46,7 +46,7 @@ int height;
|
|||||||
AVRational video_time_base;
|
AVRational video_time_base;
|
||||||
AVFrame *Frame;
|
AVFrame *Frame;
|
||||||
|
|
||||||
volatile uint32_t driver_lock;
|
extern mutex_t driver_lock;
|
||||||
|
|
||||||
void get_client_rect(rect_t *rc);
|
void get_client_rect(rect_t *rc);
|
||||||
|
|
||||||
@ -565,16 +565,12 @@ int video_thread(void *param)
|
|||||||
AVCodecContext *ctx = param;
|
AVCodecContext *ctx = param;
|
||||||
window_t *MainWindow;
|
window_t *MainWindow;
|
||||||
|
|
||||||
|
|
||||||
printf("%s\n", __FUNCTION__);
|
|
||||||
|
|
||||||
init_winlib();
|
init_winlib();
|
||||||
|
|
||||||
MainWindow = create_window(movie_file,0,
|
MainWindow = create_window(movie_file,0,
|
||||||
10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc);
|
10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc);
|
||||||
|
|
||||||
MainWindow->panel.prg->max = stream_duration;
|
MainWindow->panel.prg->max = stream_duration;
|
||||||
// printf("MainWindow %x\n", MainWindow);
|
|
||||||
|
|
||||||
show_window(MainWindow, NORMAL);
|
show_window(MainWindow, NORMAL);
|
||||||
|
|
||||||
@ -587,14 +583,17 @@ int video_thread(void *param)
|
|||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__sync_or_and_fetch(&threads_running,VIDEO_THREAD);
|
||||||
|
|
||||||
render_draw_client(main_render);
|
render_draw_client(main_render);
|
||||||
player_state = PLAY;
|
player_state = PLAY;
|
||||||
|
|
||||||
run_render(MainWindow, main_render);
|
run_render(MainWindow, main_render);
|
||||||
|
|
||||||
|
__sync_and_and_fetch(&threads_running,~VIDEO_THREAD);
|
||||||
|
|
||||||
destroy_render(main_render);
|
destroy_render(main_render);
|
||||||
fini_winlib();
|
fini_winlib();
|
||||||
|
|
||||||
player_state = CLOSED;
|
player_state = CLOSED;
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user