static size_t PictureAttach(vout_display_t *vd, picture_t *pic) { vout_display_sys_t *sys = vd->sys; xcb_connection_t *conn = sys->conn; xcb_shm_seg_t segment = sys->segment; const picture_buffer_t *buf = pic->p_sys; if (segment == 0 /* SHM extension not supported */ || buf->fd == -1 /* picture buffer not in shared memory */) return -1; int fd = vlc_dup(buf->fd); if (fd == -1) return -1; xcb_void_cookie_t c = xcb_shm_attach_fd_checked(conn, segment, fd, 1); xcb_generic_error_t *e = xcb_request_check(conn, c); if (e != NULL) /* attach failure (likely remote access) */ { free(e); return -1; } return buf->offset; }
/***************************************************************************** * Open: open the file *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_access_out_t *p_access = (sout_access_out_t*)p_this; int fd; config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); if( !p_access->psz_path ) { msg_Err( p_access, "no file name specified" ); return VLC_EGENERIC; } bool overwrite = var_GetBool (p_access, SOUT_CFG_PREFIX"overwrite"); bool append = var_GetBool( p_access, SOUT_CFG_PREFIX "append" ); if (!strcmp (p_access->psz_access, "fd")) { char *end; fd = strtol (p_access->psz_path, &end, 0); if (!*p_access->psz_path || *end) { msg_Err (p_access, "invalid file descriptor: %s", p_access->psz_path); return VLC_EGENERIC; } fd = vlc_dup (fd); if (fd == -1) { msg_Err (p_access, "cannot use file descriptor: %s", vlc_strerror_c(errno)); return VLC_EGENERIC; } } else if( !strcmp( p_access->psz_path, "-" ) ) { #if defined( _WIN32 ) || defined( __OS2__ ) setmode (STDOUT_FILENO, O_BINARY); #endif fd = vlc_dup (STDOUT_FILENO); if (fd == -1) { msg_Err (p_access, "cannot use standard output: %s", vlc_strerror_c(errno)); return VLC_EGENERIC; } msg_Dbg( p_access, "using stdout" ); } else { const char *path = p_access->psz_path; char *buf = NULL; if (var_InheritBool (p_access, SOUT_CFG_PREFIX"format")) { buf = str_format_time (path); path_sanitize (buf); path = buf; } int flags = O_RDWR | O_CREAT | O_LARGEFILE; if (!overwrite) flags |= O_EXCL; if (!append) flags |= O_TRUNC; #ifdef O_SYNC if (var_GetBool (p_access, SOUT_CFG_PREFIX"sync")) flags |= O_SYNC; #endif do { fd = vlc_open (path, flags, 0666); if (fd != -1) break; if (fd == -1) msg_Err (p_access, "cannot create %s: %s", path, vlc_strerror_c(errno)); if (overwrite || errno != EEXIST) break; flags &= ~O_EXCL; } while (vlc_dialog_wait_question (p_access, VLC_DIALOG_QUESTION_NORMAL, _("Keep existing file"), _("Overwrite"), NULL, path, _("The output file already exists. " "If recording continues, the file will be " "overridden and its content will be lost.")) == 1); free (buf); if (fd == -1) return VLC_EGENERIC; } struct stat st; if (fstat (fd, &st)) { msg_Err (p_access, "write error: %s", vlc_strerror_c(errno)); close (fd); return VLC_EGENERIC; } p_access->pf_read = Read; if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode)) { p_access->pf_write = Write; p_access->pf_seek = Seek; } #ifdef S_ISSOCK else if (S_ISSOCK(st.st_mode)) { p_access->pf_write = Send; p_access->pf_seek = NoSeek; } #endif else { p_access->pf_write = WritePipe; p_access->pf_seek = NoSeek; } p_access->pf_control = Control; p_access->p_sys = (void *)(intptr_t)fd; msg_Dbg( p_access, "file access output opened (%s)", p_access->psz_path ); if (append) lseek (fd, 0, SEEK_END); return VLC_SUCCESS; }
/***************************************************************************** * Open: open the file *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_access_out_t *p_access = (sout_access_out_t*)p_this; int fd; config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); if( !p_access->psz_path ) { msg_Err( p_access, "no file name specified" ); return VLC_EGENERIC; } bool append = var_GetBool( p_access, SOUT_CFG_PREFIX "append" ); if (!strcmp (p_access->psz_access, "fd")) { char *end; fd = strtol (p_access->psz_path, &end, 0); if (!*p_access->psz_path || *end) { msg_Err (p_access, "invalid file descriptor: %s", p_access->psz_path); return VLC_EGENERIC; } fd = vlc_dup (fd); if (fd == -1) { msg_Err (p_access, "cannot use file descriptor: %m"); return VLC_EGENERIC; } } #ifndef UNDER_CE else if( !strcmp( p_access->psz_path, "-" ) ) { #ifdef WIN32 setmode (fileno (stdout), O_BINARY); #endif fd = vlc_dup (fileno (stdout)); if (fd == -1) { msg_Err (p_access, "cannot use standard output: %m"); return VLC_EGENERIC; } msg_Dbg( p_access, "using stdout" ); } #endif else { char *psz_tmp = str_format( p_access, p_access->psz_path ); path_sanitize( psz_tmp ); fd = vlc_open( psz_tmp, O_RDWR | O_CREAT | O_LARGEFILE | #ifdef O_SYNC (var_GetBool( p_access, SOUT_CFG_PREFIX "sync" ) ? O_SYNC : 0) | #endif (append ? 0 : O_TRUNC), 0666 ); free( psz_tmp ); if (fd == -1) { msg_Err (p_access, "cannot create %s: %m", p_access->psz_path); return VLC_EGENERIC; } } p_access->pf_write = Write; p_access->pf_read = Read; p_access->pf_seek = Seek; p_access->pf_control = Control; p_access->p_sys = (void *)(intptr_t)fd; msg_Dbg( p_access, "file access output opened (%s)", p_access->psz_path ); if (append) lseek (fd, 0, SEEK_END); return VLC_SUCCESS; }