Merge svn changes up to r31211

The merged cache2.c changes are known to have problems. Will merge
further fixes to them before merging this to the master branch.
This commit is contained in:
Uoti Urpala 2010-05-30 16:06:10 +03:00
commit 2f1a518d45
8 changed files with 103 additions and 60 deletions

View File

@ -25,6 +25,7 @@ MPlayer (1.0)
* support ISDB-Tb DVB streams
Drivers:
* -vo md5sum md5 calculation changed so output matches FFmpeg's -f framemd5
* Support for more formats in OpenGL video output drivers (different YUV
subsampling, 16 bit per component)
* Selectable YUV to RGB conversion standard for -vo gl

11
configure vendored
View File

@ -462,7 +462,6 @@ Use these options if autodetection fails:
--with-xvmclib=NAME adapter-specific library name (e.g. XvMCNVIDIA)
--with-freetype-config=PATH path to freetype-config
--with-fribidi-config=PATH path to fribidi-config
--with-glib-config=PATH path to glib*-config
--with-gtk-config=PATH path to gtk*-config
--with-sdl-config=PATH path to sdl*-config
@ -681,7 +680,6 @@ _macosx_bundle=auto
_sortsub=yes
_freetypeconfig='freetype-config'
_fribidi=auto
_fribidiconfig='fribidi-config'
_enca=auto
_inet6=auto
_gethostbyname2=auto
@ -743,9 +741,6 @@ for ac_option do
--with-freetype-config=*)
_freetypeconfig=$(echo $ac_option | cut -d '=' -f 2)
;;
--with-fribidi-config=*)
_fribidiconfig=$(echo $ac_option | cut -d '=' -f 2)
;;
--with-gtk-config=*)
_gtkconfig=$(echo $ac_option | cut -d '=' -f 2)
;;
@ -6171,10 +6166,10 @@ EOF
_inc_tmp=""
_ld_tmp="-lfribidi"
cc_check $_inc_tmp $_ld_tmp && _fribidi=yes
if $_fribidiconfig --version > /dev/null 2>&1 &&
if $_pkg_config --exists fribidi > /dev/null 2>&1 &&
test "$_fribidi" = no ; then
_inc_tmp="$($_fribidiconfig --cflags)"
_ld_tmp="$($_fribidiconfig --libs)"
_inc_tmp="$($_pkg_config --cflags)"
_ld_tmp="$($_pkg_config --libs)"
cc_check $_inc_tmp $_ld_tmp && _fribidi=yes
fi
fi

View File

@ -1003,6 +1003,7 @@ videocodec ffodivx
fourcc M4T3,DMK2,DIGI,INMC
fourcc EPHV,SN40
fourcc uldx,ULDX,VSPX
fourcc SIPP ; Samsung SHR-6040
driver ffmpeg
dll mpeg4 ;opendivx
out YV12,I420,IYUV

View File

@ -167,6 +167,10 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags)
yuv_buffer yuv;
mp_image_t* mpi;
// no delayed frames
if (!data || !len)
return NULL;
memset (&op, 0, sizeof (op));
op.bytes = len;
op.packet = data;

View File

@ -503,12 +503,19 @@ static void autodetectGlExtensions(void) {
ati_broken_pbo = ver && ver < 8395;
}
if (ati_hack == -1) ati_hack = ati_broken_pbo;
if (force_pbo == -1 && extensions && strstr(extensions, "_pixel_buffer_object"))
force_pbo = is_ati;
if (use_rectangle == -1 && extensions && strstr(extensions, "_texture_non_power_of_two"))
if (force_pbo == -1) {
force_pbo = 0;
if (extensions && strstr(extensions, "_pixel_buffer_object"))
force_pbo = is_ati;
}
if (use_rectangle == -1) {
use_rectangle = 0;
if (use_rectangle == -1 && extensions && strstr(extensions, "_texture_rectangle"))
use_rectangle = renderer && strstr(renderer, "Mesa DRI R200") ? 1 : 0;
if (extensions) {
// if (strstr(extensions, "_texture_non_power_of_two"))
if (strstr(extensions, "_texture_rectangle"))
use_rectangle = renderer && strstr(renderer, "Mesa DRI R200") ? 1 : 0;
}
}
if (use_osd == -1)
use_osd = mpglBindTexture != NULL;
if (use_yuv == -1)

View File

@ -218,6 +218,8 @@ static uint32_t draw_image(mp_image_t *mpi)
h = h / 2;
for (i=0; i<h; i++) {
av_md5_update(md5_context, planeU + i * strideU, w);
}
for (i=0; i<h; i++) {
av_md5_update(md5_context, planeV + i * strideV, w);
}
av_md5_final(md5_context, md5sum);

View File

@ -2468,7 +2468,7 @@ static double update_video(struct MPContext *mpctx)
if (in_size < 0) {
// try to extract last frames in case of decoder lag
in_size = 0;
pts = 1e300;
pts = MP_NOPTS_VALUE;
hit_eof = true;
}
if (in_size > max_framesize)

View File

@ -23,6 +23,10 @@
// TODO: seeking, data consistency checking
#define READ_USLEEP_TIME 10000
// These defines are used to reduce the cost of many succesive
// seeks (e.g. when a file has no index) by spinning quickly at first.
#define INITIAL_FILL_USLEEP_TIME 1000
#define INITIAL_FILL_USLEEP_COUNT 10
#define FILL_USLEEP_TIME 50000
#define PREFILL_SLEEP_TIME 200
#define CONTROL_SLEEP_TIME 0
@ -49,6 +53,10 @@ static void ThreadProc( void *s );
static void *ThreadProc(void *s);
#else
#include <sys/wait.h>
#define FORKED_CACHE 1
#endif
#ifndef FORKED_CACHE
#define FORKED_CACHE 0
#endif
#include "mp_msg.h"
@ -88,6 +96,14 @@ static int min_fill=0;
int cache_fill_status=0;
static void cache_wakeup(stream_t *s)
{
#if FORKED_CACHE
// signal process to wake up immediately
kill(s->cache_pid, SIGUSR1);
#endif
}
static void cache_stats(cache_vars_t *s)
{
int newb=s->max_filepos-s->read_filepos; // new bytes in the buffer
@ -261,13 +277,25 @@ static int cache_execute_control(cache_vars_t *s) {
return 1;
}
static void *shared_alloc(int size) {
#if FORKED_CACHE
return shmem_alloc(size);
#else
return malloc(size);
#endif
}
static void shared_free(void *ptr, int size) {
#if FORKED_CACHE
shmem_free(ptr, size);
#else
free(ptr);
#endif
}
static cache_vars_t* cache_init(int size,int sector){
int num;
#if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__)
cache_vars_t* s=shmem_alloc(sizeof(cache_vars_t));
#else
cache_vars_t* s=malloc(sizeof(cache_vars_t));
#endif
cache_vars_t* s=shared_alloc(sizeof(cache_vars_t));
if(s==NULL) return NULL;
memset(s,0,sizeof(cache_vars_t));
@ -277,18 +305,10 @@ static cache_vars_t* cache_init(int size,int sector){
}//32kb min_size
s->buffer_size=num*sector;
s->sector_size=sector;
#if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__)
s->buffer=shmem_alloc(s->buffer_size);
#else
s->buffer=malloc(s->buffer_size);
#endif
s->buffer=shared_alloc(s->buffer_size);
if(s->buffer == NULL){
#if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__)
shmem_free(s,sizeof(cache_vars_t));
#else
free(s);
#endif
shared_free(s, sizeof(cache_vars_t));
return NULL;
}
@ -300,7 +320,7 @@ static cache_vars_t* cache_init(int size,int sector){
void cache_uninit(stream_t *s) {
cache_vars_t* c = s->cache_data;
if(s->cache_pid) {
#if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__)
#if !FORKED_CACHE
cache_do_control(s, -2, NULL);
#else
kill(s->cache_pid,SIGKILL);
@ -309,16 +329,10 @@ void cache_uninit(stream_t *s) {
s->cache_pid = 0;
}
if(!c) return;
#if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__)
free(c->buffer);
shared_free(c->buffer, c->buffer_size);
c->buffer = NULL;
c->stream = NULL;
free(s->cache_data);
#else
shmem_free(c->buffer,c->buffer_size);
c->buffer = NULL;
shmem_free(s->cache_data,sizeof(cache_vars_t));
#endif
shared_free(s->cache_data, sizeof(cache_vars_t));
s->cache_data = NULL;
}
@ -327,6 +341,27 @@ static void exit_sighandler(int x){
exit(0);
}
static void dummy_sighandler(int x) {
}
/**
* Main loop of the cache process or thread.
*/
static void cache_mainloop(cache_vars_t *s) {
int sleep_count = 0;
do {
if (!cache_fill(s)) {
if (sleep_count < INITIAL_FILL_USLEEP_COUNT) {
sleep_count++;
usec_sleep(INITIAL_FILL_USLEEP_TIME);
} else
usec_sleep(FILL_USLEEP_TIME); // idle
} else
sleep_count = 0;
// cache_stats(s->cache_data);
} while (cache_execute_control(s));
}
/**
* \return 1 on success, 0 if the function was interrupted and -1 on error
*/
@ -356,7 +391,7 @@ int stream_enable_cache(stream_t *stream,int size,int min,int seek_limit){
min = s->buffer_size - s->fill_limit;
}
#if !defined(__MINGW32__) && !defined(PTHREAD_CACHE) && !defined(__OS2__)
#if FORKED_CACHE
if((stream->cache_pid=fork())){
if ((pid_t)stream->cache_pid == -1)
stream->cache_pid = 0;
@ -404,33 +439,29 @@ err_out:
return res;
}
#if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__)
}
#ifdef PTHREAD_CACHE
static void *ThreadProc( void *s ){
#else
static void ThreadProc( void *s ){
#endif
#endif
// cache thread mainloop:
#if FORKED_CACHE
signal(SIGTERM,exit_sighandler); // kill
do {
if(!cache_fill(s)){
usec_sleep(FILL_USLEEP_TIME); // idle
}
// cache_stats(s->cache_data);
} while (cache_execute_control(s));
#if defined(__MINGW32__) || defined(__OS2__)
_endthread();
#elif defined(PTHREAD_CACHE)
return NULL;
#else
signal(SIGUSR1, dummy_sighandler); // wakeup
cache_mainloop(s);
// make sure forked code never leaves this function
exit(0);
#endif
}
#if !FORKED_CACHE
#if defined(__MINGW32__) || defined(__OS2__)
static void ThreadProc( void *s ){
cache_mainloop(s);
_endthread();
}
#else
static void *ThreadProc( void *s ){
cache_mainloop(s);
return NULL;
}
#endif
#endif
int cache_stream_fill_buffer(stream_t *s){
int len;
if(s->eof){ s->buf_pos=s->buf_len=0; return 0; }
@ -465,6 +496,7 @@ int cache_stream_seek_long(stream_t *stream,off_t pos){
newpos=pos/s->sector_size; newpos*=s->sector_size; // align
stream->pos=s->read_filepos=newpos;
s->eof=0; // !!!!!!!
cache_wakeup(stream);
cache_stream_fill_buffer(stream);
@ -509,6 +541,7 @@ int cache_do_control(stream_t *stream, int cmd, void *arg) {
default:
return STREAM_UNSUPPORTED;
}
cache_wakeup(stream);
while (s->control != -1)
usec_sleep(CONTROL_SLEEP_TIME);
switch (cmd) {