<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-15"
http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
I'm in the process of creating the new patches that incorporates the
fixes/suggestions mentioned here. I was in the middle of looking into
what it would take to use dprintf as suggested, but am pretty sure I'm
not familiar enough with automake/autoconf to do it with any degree of
confidence, and would rather not do it badly.<br>
<br>
Having said that it occurred to me that simply using vlc_fopen &
fprintf would make even more sense, seeing as it's a text file that I
am writing, and am calling write in a loop, writing small sections at a
time.<br>
<br>
Make sense?<br>
<br>
Keary<br>
<br>
Rémi Denis-Courmont wrote:
<blockquote cite="mid:201003271925.18279.rem@videolan.org" type="cite">
<pre wrap=""> Hello,
Is there any reason why you don't use git format? It makes merging more
difficult for us. Comments follow.
(...)
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_sout.h>
+#include <vlc_block.h>
+#include <vlc_fs.h>f
Typo................^
+#include <vlc_strings.h>
+#include <vlc_charset.h>
+#if defined( WIN32 ) && !defined( UNDER_CE )
+# include <io.h>
+# define lseek _lseeki64
This is not needed, is it?
+struct sout_access_out_sys_t
+{
+ char *psz_cursegPath;
+ char *psz_indexPath;
+ char *psz_indexUrl;
+ mtime_t i_opendts;
+ mtime_t i_seglenm;
+ int i_handle;
+ int i_segment;
unsigned
+ int i_seglen;
size_t
+ int i_numsegs;
unsigned
+ bool b_delsegs;
+ bool b_ratecontrol;
+ bool b_splitanywhere;
+};
+
+/*****************************************************************************
+ * Open: open the file
+
*****************************************************************************/
+static int Open( vlc_object_t *p_this )
+{
+ sout_access_out_t *p_access = (sout_access_out_t*)p_this;
+ sout_access_out_sys_t *p_sys;
+ char *psz_idx;
+
+ 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;
+ }
+
+ p_access->pf_write = Write;
+ p_access->pf_read = Read;
+ p_access->pf_seek = Seek;
+ p_access->pf_control = Control;
+ if( !( p_sys = malloc ( sizeof( *p_sys ) ) ) )
+ return VLC_ENOMEM;
+
+ p_sys->i_seglen = var_GetInteger( p_access, SOUT_CFG_PREFIX "seglen" );
+ p_sys->i_seglenm = UINT64_C(1000000) * p_sys->i_seglen;
Use CLOCK_FREQ.
+ p_sys->psz_indexPath = 0;
Use NULL.
+ p_sys->psz_indexUrl = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX
"index-url" );
+
+ psz_idx = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "index" );
+ if ( psz_idx )
+ {
+ char *psz_tmp;
+ if ( ! ( psz_tmp = str_format( p_access, psz_idx ) ) )
+ {
+ free( p_sys );
+ return VLC_ENOMEM;
p_sys->psz_indexUrl is leaked here, no?
+ }
+ path_sanitize( psz_tmp );
+ p_sys->psz_indexPath = psz_tmp;
+ vlc_unlink( p_sys->psz_indexPath );
+ }
+
+ p_access->p_sys = p_sys;
+ p_sys->i_handle = -1;
+ p_sys->i_segment = 0;
+ p_sys->psz_cursegPath = 0;
NULL.
+
+ return VLC_SUCCESS;
+}
+
(...)
+static char *formatSegmentPath( sout_access_out_t *p_access, char *psz_path,
int i_seg, bool b_sanitize )
+{
+ char *psz_tmp;
+ char *p1, *p2;
+
+ if ( ! ( psz_tmp = str_format( p_access, psz_path ) ) )
+ return NULL;
+
+ p1 = psz_tmp;
+ while( *p1 && *p1 != '#' )
+ p1++;
Use strspn().
+ if ( *p1 ) {
+ p2 = p1+1;
+ while( *p2 && *p2 == '#' )
+ p2++;
Use strspn().
+ int numcnt = p2 - p1;
+ char *segstr;
+ if ( asprintf( &segstr, "%0*d", numcnt, i_seg ) < 0 )
+ {
+ free( psz_tmp );
+ return NULL;
+ }
+ char *psz_tmp2;
+ *p1 = '\0';
+ int ret = asprintf( &psz_tmp2, "%s%s%s", psz_tmp, segstr, p2 );
+ free( psz_tmp );
Could this not be done with a single asprintf() call?
+ const char *lo = ToLocale ( oldpath );
+ if (lo == NULL)
+ goto error;
+
+ const char *ln = ToLocale ( newpath );
+ if (ln == NULL)
+ {
+ LocaleFree ( lo );
+error:
+ errno = ENOENT;
+ return -1;
+ }
+
+ int ret = rename ( lo, ln );
+ LocaleFree ( lo );
+ LocaleFree ( ln );
+ return ret;
Couldn't this use vlc_rename() in the non Windows case. Just make a separate
patch to export it.
(...)
+ strcpy( psz_idxTmp, p_sys->psz_indexPath );
+ strcpy( psz_idxTmp + strlen( psz_idxTmp ), TMP_IDX_SUFFIX );
+ vlc_unlink( psz_idxTmp );
Is this needed?
+ fd = vlc_open( psz_idxTmp, O_RDWR | O_CREAT | O_LARGEFILE |
+ O_TRUNC, 0666 );
s/O_RDWR/O_WRONLY/
+ if ( fd == -1 )
+ {
+ msg_Err( p_access, "cannot open index file `%s' (%m)", psz_idxTmp
);
+ free( psz_idxTmp );
+ return -1;
+ }
+ if ( asprintf( &psz_buf, "#EXTM3U\n#EXT-X-TARGETDURATION:%d\n#EXT-X-
MEDIA-SEQUENCE:%d\n", p_sys->i_seglen, i_firstseg ) < 0 )
+ {
+ free( psz_idxTmp );
+ close( fd );
+ return -1;
+ }
+
+ val = write ( fd, psz_buf, strlen( psz_buf ) );
You could avoid strlen() using the result of asprintf().
Arguably dprintf() should be used (it might need to be added to compat/*).
Same later.
+ if ( asprintf( &psz_buf, "#EXTINF:%d\n%s", p_sys->i_seglen,
psz_name ) < 0)
+ {
+ free( psz_name ) ;
+ free( psz_idxTmp );
+ close( fd );
+ return -1;
+ }
+
+ val = write( fd, psz_buf, strlen( psz_buf ) );
+ if ( val >= 0 )
+ val = write( fd, "\n", strlen( "\n" ) );
Just write the newline in the asprintf(). This saves one system call.
+ /* Only need to repeat this on Win32 which doesn't support
+ atomic renames */
+#ifdef WIN32
+ int i_attempt = 1;
+ do
+ {
+#endif
+ val = prv_vlc_rename( psz_idxTmp, p_sys->psz_indexPath );
+#ifdef WIN32
+ if ( val < 0 && i_attempt < MAX_RENAME_RETRIES)
+ {
+ msg_Warn ( p_access, "Rename failed -- Retrying");
+ msleep(1000*100);
+ }
+ }
+ while(val < 0 && i_attempt++ < MAX_RENAME_RETRIES);
+#endif
I would rather put this ugliness in the prv_vlc_rename() function...
(...)
+static void Close( vlc_object_t * p_this )
+{
+ sout_access_out_t *p_access = (sout_access_out_t*)p_this;
+ sout_access_out_sys_t *p_sys = p_access->p_sys;
+
+
+ closeCurrentSegment( p_access, p_sys, true );
+ if ( p_sys->psz_indexPath )
+ free( p_sys->psz_indexPath );
The if statement is not needed here.
(...)
+static ssize_t openNextFile( sout_access_out_t *p_access,
sout_access_out_sys_t *p_sys )
+{
+ int fd;
+
+ int i_newseg = p_sys->i_segment + 1;
+
+ char *psz_seg = formatSegmentPath( p_access, p_access->psz_path,
i_newseg, true );
+ if ( !psz_seg )
+ return -1;
+
+ fd = vlc_open( psz_seg, O_RDWR | O_CREAT | O_LARGEFILE |
+ O_TRUNC, 0666 );
O_WRONLY.
I guess this should be a separate patch:
diff --git a/modules/mux/mpeg/ts.c b/modules/mux/mpeg/ts.c
index 34e4e3e..893140e 100644
--- a/modules/mux/mpeg/ts.c
+++ b/modules/mux/mpeg/ts.c
@@ -2019,6 +2019,12 @@ static block_t *TSNew( sout_mux_t *p_mux, ts_stream_t
*p_stream,
}
p_ts = block_New( p_mux, 188 );
+
+ if (b_new_pes && !(p_pes->i_flags & BLOCK_FLAG_NO_KEYFRAME) && p_pes-
</pre>
<blockquote type="cite">
<pre wrap="">i_flags & BLOCK_FLAG_TYPE_I)
</pre>
</blockquote>
<pre wrap=""><!---->+ {
+ p_ts->i_flags |= BLOCK_FLAG_TYPE_I;
+ }
+
p_ts->i_dts = p_pes->i_dts;
p_ts->p_buffer[0] = 0x47;
</pre>
</blockquote>
</body>
</html>