Mercurial > mplayer.hg
view av_helpers.c @ 33960:1cd81338af07
Rework fullscreen handling.
This should fix all problems the GUI had with fullscreen handling.
In interface.c:
1. Remove disabled code.
2. Set background of inactive video window to black (which prevents
some flashing when starting the playback in fullscreen mode).
3. Set the state of the fullscreen button according to next playback
mode (normal or fullscreen).
4. Make the video window invisible if there is no video, but don't
make it visible that early if there is video.
5. Set the global fullscreen variable to get aspect scaling. (Hack)
6. In GUI_SETUP_VIDEO_WINDOW:
a. First set the video size,
b. then resize and reposition,
c. then make the window visible,
d. switch to/from fullscreen, if necessary.
(This minimizes disturbances and the display stays in fullscreen
mode and is smoothly black as often as possible.)
7. When playback ends, either act as in 6. or make video window
quickly invisible if requested.
In actions.c:
8. Allow calling uiFullScreen() even if not playing.
9. Remove unnecessary (and misplaced) repositioning (but not properly
resizing) code from uiFullScreen().
10. Don't call wsFullScreen() conditionally.
11. Only set global variable vo_fs, not the global fullscreen
variable.
author | ib |
---|---|
date | Thu, 01 Sep 2011 20:15:40 +0000 |
parents | 5f1faa91717e |
children | fd7abb6f787a |
line wrap: on
line source
/* * Generic libav* helpers * * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with MPlayer; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "mp_msg.h" #include "av_helpers.h" int avcodec_initialized; int avformat_initialized; static void mp_msp_av_log_callback(void *ptr, int level, const char *fmt, va_list vl) { static int print_prefix=1; AVClass *avc= ptr ? *(AVClass **)ptr : NULL; int type= MSGT_FIXME; int mp_level; switch(level){ case AV_LOG_VERBOSE: mp_level = MSGL_V ; break; case AV_LOG_DEBUG: mp_level= MSGL_V ; break; case AV_LOG_INFO : mp_level= MSGL_INFO; break; case AV_LOG_ERROR: mp_level= MSGL_ERR ; break; default : mp_level= level > AV_LOG_DEBUG ? MSGL_DBG2 : MSGL_ERR; break; } if (ptr && !avc) mp_msg(MSGT_DECVIDEO, MSGL_ERR, "libav* called av_log with context containing a broken AVClass!\n"); if (avc) { if(!strcmp(avc->class_name, "AVCodecContext")){ AVCodecContext *s= ptr; if(s->codec){ if(s->codec->type == AVMEDIA_TYPE_AUDIO){ if(s->codec->decode) type= MSGT_DECAUDIO; }else if(s->codec->type == AVMEDIA_TYPE_VIDEO){ if(s->codec->decode) type= MSGT_DECVIDEO; } //FIXME subtitles, encoders (what msgt for them? there is no appropriate ...) } }else if(!strcmp(avc->class_name, "AVFormatContext")){ AVFormatContext *s= ptr; if(s->iformat) type= MSGT_DEMUXER; else if(s->oformat) type= MSGT_MUXER; } } if (!mp_msg_test(type, mp_level)) return; if(print_prefix && avc) { mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc); } print_prefix= strchr(fmt, '\n') != NULL; mp_msg_va(type, mp_level, fmt, vl); } void init_avcodec(void) { if (!avcodec_initialized) { avcodec_init(); avcodec_register_all(); avcodec_initialized = 1; av_log_set_callback(mp_msp_av_log_callback); } } void init_avformat(void) { if (!avformat_initialized) { av_register_all(); avformat_initialized = 1; av_log_set_callback(mp_msp_av_log_callback); } }