91309cca24665ea19a3790f7932e7d14b44dcd13
[vlc.git] / modules / video_output / vdummy.c
1 /*****************************************************************************
2  * vdummy.c: Dummy video output display method for testing purposes
3  *****************************************************************************
4  * Copyright (C) 2000-2009 VLC authors and VideoLAN
5  *
6  * Authors: Samuel Hocevar <sam@zoy.org>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22
23 /*****************************************************************************
24  * Preamble
25  *****************************************************************************/
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <vlc_common.h>
32 #include <vlc_plugin.h>
33 #include <vlc_vout_display.h>
34
35 #define CHROMA_TEXT N_("Dummy image chroma format")
36 #define CHROMA_LONGTEXT N_( \
37     "Force the dummy video output to create images using a specific chroma " \
38     "format instead of trying to improve performances by using the most " \
39     "efficient one.")
40
41 static int OpenDummy(vout_display_t *vd, const vout_display_cfg_t *cfg,
42                      video_format_t *fmtp, vlc_video_context *context);
43 static int OpenStats(vout_display_t *vd, const vout_display_cfg_t *cfg,
44                      video_format_t *fmtp, vlc_video_context *context);
45
46 vlc_module_begin ()
47     set_shortname( N_("Dummy") )
48     set_description( N_("Dummy video output") )
49     set_callback_display( OpenDummy, 0 )
50     add_shortcut( "dummy" )
51
52     set_category( CAT_VIDEO )
53     set_subcategory( SUBCAT_VIDEO_VOUT )
54     add_string( "dummy-chroma", NULL, CHROMA_TEXT, CHROMA_LONGTEXT, true )
55
56     add_submodule ()
57     set_description( N_("Statistics video output") )
58     add_shortcut( "stats" )
59     set_callback_display( OpenStats, 0 )
60 vlc_module_end ()
61
62
63 /*****************************************************************************
64  * Local prototypes
65  *****************************************************************************/
66 static void            DisplayStat(vout_display_t *, picture_t *);
67 static int             Control(vout_display_t *, int);
68
69 /*****************************************************************************
70  * OpenVideo: activates dummy vout display method
71  *****************************************************************************/
72 static void Open(vout_display_t *vd, video_format_t *fmt)
73 {
74     /* p_vd->info is not modified */
75
76     char *chroma = var_InheritString(vd, "dummy-chroma");
77     if (chroma) {
78         vlc_fourcc_t fcc = vlc_fourcc_GetCodecFromString(VIDEO_ES, chroma);
79         if (fcc != 0) {
80             msg_Dbg(vd, "forcing chroma 0x%.8x (%4.4s)", fcc, (char*)&fcc);
81             fmt->i_chroma = fcc;
82         }
83         free(chroma);
84     }
85 }
86
87 static const struct vlc_display_operations ops_dummy = {
88     NULL, NULL, NULL, Control, NULL, NULL,
89 };
90
91 static int OpenDummy(vout_display_t *vd, const vout_display_cfg_t *cfg,
92                      video_format_t *fmtp, vlc_video_context *context)
93 {
94     (void) cfg; (void) context;
95     Open(vd, fmtp);
96     vd->ops = &ops_dummy;
97     return VLC_SUCCESS;
98 }
99
100 static const struct vlc_display_operations ops_stats = {
101     NULL, NULL, DisplayStat, Control, NULL, NULL,
102 };
103
104 static int OpenStats(vout_display_t *vd, const vout_display_cfg_t *cfg,
105                      video_format_t *fmtp, vlc_video_context *context)
106 {
107     (void) cfg; (void) context;
108     Open(vd, fmtp);
109     vd->ops = &ops_stats;
110     return VLC_SUCCESS;
111 }
112
113 static void DisplayStat(vout_display_t *vd, picture_t *picture)
114 {
115     plane_t *p = picture->p;
116
117     VLC_UNUSED(vd);
118
119     if (picture->format.i_width * picture->format.i_height >= sizeof (vlc_tick_t)
120      && (p->i_pitch * p->i_lines) >= (ssize_t)sizeof (vlc_tick_t)) {
121         vlc_tick_t date;
122         memcpy(&date, p->p_pixels, sizeof(date));
123         msg_Dbg(vd, "VOUT got %"PRIu64" ms offset",
124                 MS_FROM_VLC_TICK(vlc_tick_now() - date));
125     }
126 }
127
128 static int Control(vout_display_t *vd, int query)
129 {
130     (void) vd;
131
132     switch (query) {
133         case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
134         case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
135         case VOUT_DISPLAY_CHANGE_ZOOM:
136         case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
137         case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
138             return VLC_SUCCESS;
139     }
140     return VLC_SUCCESS;
141 }