view gui/cfg.c @ 33235:6e6eac0ea1b4

Replace usage of AVCodecContext member hurry_up by skip_idct and skip_frame. AVCodecContext member hurry_up is deprecated in favor of skip_idct and skip_frame and won't be applicable with libavcodec starting from major version number 53 by default. The configure hack FF_API_HURRY_UP=1 to allow further usage of hurry_up is no longer needed. As a result, usage of a recent standard ffmpeg as shared library is possible again.
author ib
date Sun, 24 Apr 2011 16:13:25 +0000
parents 6197c605769e
children a419ec5afc9e
line wrap: on
line source

/*
 * 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 <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "cfg.h"
#include "interface.h"

#include "config.h"
#include "help_mp.h"
#include "libmpcodecs/vd.h"
#include "libvo/video_out.h"
#include "libvo/x11_common.h"
#include "m_config.h"
#include "m_option.h"
#include "mixer.h"
#include "mp_msg.h"
#include "mpcommon.h"
#include "mplayer.h"
#include "parser-cfg.h"
#include "path.h"
#include "sub/font_load.h"
#include "sub/sub.h"

int gtkCacheOn;
int gtkCacheSize = 2048;

int gtkVfLAVC;
int gtkVfPP;

#ifdef CONFIG_DXR3
char *gtkDXR3Device;
#endif

int gtkAutoSyncOn;
int gtkAutoSync;

int gtkAONorm;
int gtkAOSurround;
int gtkAOExtraStereo;
float gtkAOExtraStereoMul = 1.0f;

#ifdef CONFIG_ALSA
char *gtkAOALSAMixer;
char *gtkAOALSAMixerChannel;
char *gtkAOALSADevice;
#endif

#ifdef CONFIG_OSS_AUDIO
char *gtkAOOSSMixer;
char *gtkAOOSSMixerChannel;
char *gtkAOOSSDevice;
#endif

#ifdef CONFIG_ESD
char *gtkAOESDDevice;
#endif

#ifdef CONFIG_SDL
char *gtkAOSDLDriver;
#endif

int gtkEnableAudioEqualizer;

int gtkSubDumpMPSub;
int gtkSubDumpSrt;

#ifdef CONFIG_ASS
gtkASS_t gtkASS;
#endif

int gtkEnablePlayBar = 1;
int gtkLoadFullscreen;
int gtkShowVideoWindow = 1;

int gui_save_pos   = 1;
int gui_main_pos_x = -3;
int gui_main_pos_y = -3;
int gui_sub_pos_x  = -3;
int gui_sub_pos_y  = -3;

static m_config_t *gui_conf;

static const m_option_t gui_opts[] = {
    { "cache",                       &gtkCacheOn,              CONF_TYPE_FLAG,        0,          0,     1,     NULL },
    { "cache_size",                  &gtkCacheSize,            CONF_TYPE_INT,         CONF_RANGE, -1,    65535, NULL },

    { "vf_lavc",                     &gtkVfLAVC,               CONF_TYPE_FLAG,        0,          0,     1,     NULL },
    { "vf_pp",                       &gtkVfPP,                 CONF_TYPE_FLAG,        0,          0,     1,     NULL },

#ifdef CONFIG_DXR3
    { "vo_dxr3_device",              &gtkDXR3Device,           CONF_TYPE_STRING,      0,          0,     0,     NULL },
#endif

    { "autosync",                    &gtkAutoSyncOn,           CONF_TYPE_FLAG,        0,          0,     1,     NULL },
    { "autosync_size",               &gtkAutoSync,             CONF_TYPE_INT,         CONF_RANGE, 0,     10000, NULL },

    { "ao_volnorm",                  &gtkAONorm,               CONF_TYPE_FLAG,        0,          0,     1,     NULL },
    { "ao_surround",                 &gtkAOSurround,           CONF_TYPE_FLAG,        0,          0,     1,     NULL },
    { "ao_extra_stereo",             &gtkAOExtraStereo,        CONF_TYPE_FLAG,        0,          0,     1,     NULL },
    { "ao_extra_stereo_coefficient", &gtkAOExtraStereoMul,     CONF_TYPE_FLOAT,       CONF_RANGE, -10,   10,    NULL },

#ifdef CONFIG_ALSA
    { "ao_alsa_mixer",               &gtkAOALSAMixer,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "ao_alsa_mixer_channel",       &gtkAOALSAMixerChannel,   CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "ao_alsa_device",              &gtkAOALSADevice,         CONF_TYPE_STRING,      0,          0,     0,     NULL },
#endif

#ifdef CONFIG_OSS_AUDIO
    { "ao_oss_mixer",                &gtkAOOSSMixer,           CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "ao_oss_mixer_channel",        &gtkAOOSSMixerChannel,    CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "ao_oss_device",               &gtkAOOSSDevice,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
#endif

#ifdef CONFIG_ESD
    { "ao_esd_device",               &gtkAOESDDevice,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
#endif

#ifdef CONFIG_SDL
    { "ao_sdl_subdriver",            &gtkAOSDLDriver,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
#endif

    { "enable_audio_equ",            &gtkEnableAudioEqualizer, CONF_TYPE_FLAG,        0,          0,     1,     NULL },

    { "equ_channel_1",               &gtkEquChannel1,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "equ_channel_2",               &gtkEquChannel2,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "equ_channel_3",               &gtkEquChannel3,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "equ_channel_4",               &gtkEquChannel4,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "equ_channel_5",               &gtkEquChannel5,          CONF_TYPE_STRING,      0,          0,     0,     NULL },
    { "equ_channel_6",               &gtkEquChannel6,          CONF_TYPE_STRING,      0,          0,     0,     NULL },

#define audio_equ_row(i, j) \
    { "equ_band_" # i # j,           &gtkEquChannels[i][j],    CONF_TYPE_FLOAT,       CONF_RANGE, -15.0, 15.0,  NULL },
    audio_equ_row(0, 0) audio_equ_row(0, 1) audio_equ_row(0, 2) audio_equ_row(0, 3) audio_equ_row(0, 4) audio_equ_row(0, 5) audio_equ_row(0, 6) audio_equ_row(0, 7) audio_equ_row(0, 8) audio_equ_row(0, 9)
    audio_equ_row(1, 0) audio_equ_row(1, 1) audio_equ_row(1, 2) audio_equ_row(1, 3) audio_equ_row(1, 4) audio_equ_row(1, 5) audio_equ_row(1, 6) audio_equ_row(1, 7) audio_equ_row(1, 8) audio_equ_row(1, 9)
    audio_equ_row(2, 0) audio_equ_row(2, 1) audio_equ_row(2, 2) audio_equ_row(2, 3) audio_equ_row(2, 4) audio_equ_row(2, 5) audio_equ_row(2, 6) audio_equ_row(2, 7) audio_equ_row(2, 8) audio_equ_row(2, 9)
    audio_equ_row(3, 0) audio_equ_row(3, 1) audio_equ_row(3, 2) audio_equ_row(3, 3) audio_equ_row(3, 4) audio_equ_row(3, 5) audio_equ_row(3, 6) audio_equ_row(3, 7) audio_equ_row(3, 8) audio_equ_row(3, 9)
    audio_equ_row(4, 0) audio_equ_row(4, 1) audio_equ_row(4, 2) audio_equ_row(4, 3) audio_equ_row(4, 4) audio_equ_row(4, 5) audio_equ_row(4, 6) audio_equ_row(4, 7) audio_equ_row(4, 8) audio_equ_row(4, 9)
    audio_equ_row(5, 0) audio_equ_row(5, 1) audio_equ_row(5, 2) audio_equ_row(5, 3) audio_equ_row(5, 4) audio_equ_row(5, 5) audio_equ_row(5, 6) audio_equ_row(5, 7) audio_equ_row(5, 8) audio_equ_row(5, 9)
#undef audio_equ_row

    { "playbar", &gtkEnablePlayBar, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "load_fullscreen", &gtkLoadFullscreen, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "show_videowin", &gtkShowVideoWindow, CONF_TYPE_FLAG, 0, 0, 1, NULL },

    { "gui_save_pos", &gui_save_pos, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "gui_main_pos_x", &gui_main_pos_x, CONF_TYPE_INT, 0, 0, 0, NULL },
    { "gui_main_pos_y", &gui_main_pos_y, CONF_TYPE_INT, 0, 0, 0, NULL },
    { "gui_video_out_pos_x", &gui_sub_pos_x, CONF_TYPE_INT, 0, 0, 0, NULL },
    { "gui_video_out_pos_y", &gui_sub_pos_y, CONF_TYPE_INT, 0, 0, 0, NULL },

    // NOTE TO MYSELF: Do we really need all/any non-gtkOptions, i.e. override mplayer options?

    { "gui_skin", &skinName, CONF_TYPE_STRING, 0, 0, 0, NULL },

    { "stopxscreensaver", &stop_xscreensaver, CONF_TYPE_FLAG, 0, 0, 1, NULL },

    { "cdrom_device", &cdrom_device, CONF_TYPE_STRING, 0, 0, 0, NULL },
    { "dvd_device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL },

    { "osd_level", &osd_level, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL },

    { "vo_driver", &video_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL },
    { "v_vfm", &video_fm_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL },

    { "vf_autoq", &auto_quality, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL },
    { "vo_direct_render", &vo_directrendering, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "vo_doublebuffering", &vo_doublebuffering, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "vo_panscan", &vo_panscan, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL },

    { "v_flip", &flip, CONF_TYPE_INT, CONF_RANGE, -1, 1, NULL },
    { "v_framedrop", &frame_dropping, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL },
    { "v_idx", &index_mode, CONF_TYPE_INT, CONF_RANGE, -1, 2, NULL },
    { "v_ni", &force_ni, CONF_TYPE_FLAG, 0, 0, 1, NULL },

    { "ao_driver", &audio_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL },
    { "a_afm", &audio_fm_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL },

    { "softvol", &soft_vol, CONF_TYPE_FLAG, 0, 0, 1, NULL },

    { "sub_auto_load", &sub_auto, CONF_TYPE_FLAG, 0, 0, 1, NULL },
#ifdef CONFIG_ICONV
    { "sub_cp", &sub_cp, CONF_TYPE_STRING, 0, 0, 0, NULL },
#endif
    { "sub_overlap", &suboverlap_enabled, CONF_TYPE_FLAG, 0, 0, 0, NULL },
    { "sub_pos", &sub_pos, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL },
    { "sub_unicode", &sub_unicode, CONF_TYPE_FLAG, 0, 0, 1, NULL },

    { "font_factor", &font_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 10.0, NULL },
    { "font_name", &font_name, CONF_TYPE_STRING, 0, 0, 0, NULL },

#ifdef CONFIG_FREETYPE
    { "font_encoding", &subtitle_font_encoding, CONF_TYPE_STRING, 0, 0, 0, NULL },
    { "font_text_scale", &text_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0, 100, NULL },
    { "font_osd_scale", &osd_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0, 100, NULL },
    { "font_blur", &subtitle_font_radius, CONF_TYPE_FLOAT, CONF_RANGE, 0, 8, NULL },
    { "font_outline", &subtitle_font_thickness, CONF_TYPE_FLOAT, CONF_RANGE, 0, 8, NULL },
    { "font_autoscale", &subtitle_autoscale, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL },
#endif

#ifdef CONFIG_ASS
    { "ass_enabled", &ass_enabled, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "ass_use_margins", &ass_use_margins, CONF_TYPE_FLAG, 0, 0, 1, NULL },
    { "ass_top_margin", &ass_top_margin, CONF_TYPE_INT, CONF_RANGE, 0, 512, NULL },
    { "ass_bottom_margin", &ass_bottom_margin, CONF_TYPE_INT, CONF_RANGE, 0, 512, NULL },
#endif

    { NULL, NULL, 0, 0, 0, 0, NULL }
};

static char *gfgets(char *str, int size, FILE *f)
{
    char *s, c;

    s = fgets(str, size, f);

    if (s) {
        c = s[strlen(s) - 1];

        if (c == '\n' || c == '\r')
            s[strlen(s) - 1] = 0;

        c = s[strlen(s) - 1];

        if (c == '\n' || c == '\r')
            s[strlen(s) - 1] = 0;
    }

    return s;
}

int cfg_read(void)
{
    char *cfg;
    FILE *f;

    // configuration

    cfg = get_path("gui.conf");

    mp_msg(MSGT_GPLAYER, MSGL_V, "[cfg] reading config file: %s\n", cfg);

    gui_conf = m_config_new();
    m_config_register_options(gui_conf, gui_opts);

    if (!disable_gui_conf && (m_config_parse_config_file(gui_conf, cfg) < 0)) {
        mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_ConfigFileError);
// exit(1);
    }

    free(cfg);

    // playlist

    cfg = get_path("gui.pl");
    f   = fopen(cfg, "rt");

    if (f) {
        while (!feof(f)) {
            char tmp[512];
            plItem *item;

            if (gfgets(tmp, 512, f) == NULL)
                continue;

            item       = calloc(1, sizeof(plItem));
            item->path = strdup(tmp);
            gfgets(tmp, 512, f);
            item->name = strdup(tmp);
            gtkSet(gtkAddPlItem, 0, (void *)item);
        }

        fclose(f);
    }

    free(cfg);

    // URL list

    cfg = get_path("gui.url");
    f   = fopen(cfg, "rt");

    if (f) {
        while (!feof(f)) {
            char tmp[512];
            URLItem *item;

            if (gfgets(tmp, 512, f) == NULL)
                continue;

            item      = calloc(1, sizeof(URLItem));
            item->url = strdup(tmp);
            gtkSet(gtkAddURLItem, 0, (void *)item);
        }

        fclose(f);
    }

    free(cfg);

    // directory history

    cfg = get_path("gui.history");
    f   = fopen(cfg, "rt+");

    if (f) {
        int i = 0;

        while (!feof(f)) {
            char tmp[512];

            if (gfgets(tmp, 512, f) == NULL)
                continue;

            fsHistory[i++] = gstrdup(tmp);
        }

        fclose(f);
    }

    free(cfg);

    return 0;
}

int cfg_write(void)
{
    char *cfg;
    FILE *f;
    int i;

    // configuration

    cfg = get_path("gui.conf");
    f   = fopen(cfg, "wt+");

    if (f) {
        for (i = 0; gui_opts[i].name; i++) {
            char *v = m_option_print(&gui_opts[i], gui_opts[i].p);

            if (v == (char *)-1) {
                mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_UnableToSaveOption, gui_opts[i].name);
                v = NULL;
            }

            if (v) {
                fprintf(f, "%s = \"%s\"\n", gui_opts[i].name, v);
                free(v);
            }
        }

        fclose(f);
    }

    free(cfg);

    // playlist

    cfg = get_path("gui.pl");
    f   = fopen(cfg, "wt+");

    if (f) {
        plCurrent = plList;

        while (plCurrent) {
            if (plCurrent->path && plCurrent->name) {
                fprintf(f, "%s\n", plCurrent->path);
                fprintf(f, "%s\n", plCurrent->name);
            }

            plCurrent = plCurrent->next;
        }

        fclose(f);
    }

    free(cfg);

    // URL list

    cfg = get_path("gui.url");
    f   = fopen(cfg, "wt+");

    if (f) {
        while (URLList) {
            if (URLList->url)
                fprintf(f, "%s\n", URLList->url);

            URLList = URLList->next;
        }

        fclose(f);
    }

    free(cfg);

    // directory history

    cfg = get_path("gui.history");
    f   = fopen(cfg, "wt+");

    if (f) {
        int i = 0;

// while (fsHistory[i] != NULL)
        for (i = 0; i < 5; i++)
            if (fsHistory[i])
                fprintf(f, "%s\n", fsHistory[i]);

        fclose(f);
    }

    free(cfg);

    return 0;
}