[vlc-commits] livehttp: refactor Close
Ilkka Ollakka
git at videolan.org
Fri Sep 13 16:36:56 CEST 2013
vlc | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Fri Sep 13 17:01:19 2013 +0300| [21d5c53baea76bf09a60b48f865f93d1c1c52eeb] | committer: Ilkka Ollakka
livehttp: refactor Close
Use Write-function and refactored functions to check that in flushing
we don't write too long last segment but split it in multiple segments
if needed. Fixes #9383
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=21d5c53baea76bf09a60b48f865f93d1c1c52eeb
---
modules/access_output/livehttp.c | 80 +++++++++++++-------------------------
1 file changed, 28 insertions(+), 52 deletions(-)
diff --git a/modules/access_output/livehttp.c b/modules/access_output/livehttp.c
index 3088928..65b104a 100644
--- a/modules/access_output/livehttp.c
+++ b/modules/access_output/livehttp.c
@@ -203,6 +203,7 @@ static int LoadCryptFile( sout_access_out_t *p_access);
static int CryptSetup( sout_access_out_t *p_access, char *keyfile );
static int CheckSegmentChange( sout_access_out_t *p_access, block_t *p_buffer );
static ssize_t writeSegment( sout_access_out_t *p_access );
+static ssize_t openNextFile( sout_access_out_t *p_access, sout_access_out_sys_t *p_sys );
/*****************************************************************************
* Open: open the file
*****************************************************************************/
@@ -731,66 +732,41 @@ 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;
+ block_t *output_block = p_sys->block_buffer;
+ p_sys->block_buffer = NULL;
- msg_Dbg( p_access, "Flushing buffer to last file");
- bool crypted = false;
- while( p_sys->block_buffer )
+ while( output_block )
{
- if( p_sys->key_uri && !crypted)
+ block_t *p_next = output_block->p_next;
+ output_block->p_next = NULL;
+
+ /* Since we are flushing, check the segment change by hand and don't wait
+ * possible keyframe*/
+ if( ((float)(output_block->i_length * CLOCK_FREQ / INT64_C(1000000) ) +
+ (float)(output_block->i_dts - p_sys->i_opendts)) >= p_sys->i_seglenm )
{
- if( p_sys->stuffing_size )
+ closeCurrentSegment( p_access, p_sys, false );
+ if( unlikely(openNextFile( p_access, p_sys ) < 0 ) )
{
- p_sys->block_buffer = block_Realloc( p_sys->block_buffer, p_sys->stuffing_size, p_sys->block_buffer->i_buffer );
- if( unlikely(!p_sys->block_buffer) )
- return;
- memcpy( p_sys->block_buffer->p_buffer, p_sys->stuffing_bytes, p_sys->stuffing_size );
- p_sys->stuffing_size = 0;
- }
- size_t original = p_sys->block_buffer->i_buffer;
- size_t padded = (original + 15 ) & ~15;
- size_t pad = padded - original;
- if( pad )
- {
- p_sys->stuffing_size = 16 - pad;
- p_sys->block_buffer->i_buffer -= p_sys->stuffing_size;
- memcpy( p_sys->stuffing_bytes, &p_sys->block_buffer->p_buffer[p_sys->block_buffer->i_buffer], p_sys->stuffing_size );
- }
+ block_ChainRelease( output_block );
+ output_block = NULL;
+ block_ChainRelease( p_next );
- gcry_error_t err = gcry_cipher_encrypt( p_sys->aes_ctx,
- p_sys->block_buffer->p_buffer, p_sys->block_buffer->i_buffer, NULL, 0 );
- if( err )
- {
- msg_Err( p_access, "Encryption failure: %s ", gpg_strerror(err) );
- break;
+ /* Jump out of the loop so we can close rest of the stuff*/
+ continue;
}
- crypted = true;
- }
- ssize_t val = write( p_sys->i_handle, p_sys->block_buffer->p_buffer, p_sys->block_buffer->i_buffer );
- if ( val == -1 )
- {
- if ( errno == EINTR )
- continue;
- block_ChainRelease ( p_sys->block_buffer);
- break;
- }
- if( !p_sys->block_buffer->p_next )
- {
- p_sys->f_seglen = (float)( p_sys->block_buffer->i_length / (1000000)) +
- (float)(p_sys->block_buffer->i_dts - p_sys->i_opendts) / CLOCK_FREQ;
+ p_sys->i_opendts = p_sys->block_buffer ? p_sys->block_buffer->i_dts : output_block->i_dts;
}
+ Write( p_access, output_block );
+ output_block = p_next;
+ }
- if ( likely( (size_t)val >= p_sys->block_buffer->i_buffer ) )
- {
- block_t *p_next = p_sys->block_buffer->p_next;
- block_Release (p_sys->block_buffer);
- p_sys->block_buffer = p_next;
- crypted=false;
- }
- else
- {
- p_sys->block_buffer->p_buffer += val;
- p_sys->block_buffer->i_buffer -= val;
- }
+ ssize_t writevalue = writeSegment( p_access );
+ msg_Dbg( p_access, "Writing.. %"PRId64,writevalue);
+ if( unlikely( writevalue < 0 ) )
+ {
+ block_ChainRelease( p_sys->block_buffer );
+ p_sys->block_buffer = NULL;
}
closeCurrentSegment( p_access, p_sys, true );
More information about the vlc-commits
mailing list