/*****************************************************************************
* flv.c: flv muxer
*****************************************************************************
- * Copyright (C) 2009-2013 x264 project
+ * Copyright (C) 2009-2016 x264 project
*
* Authors: Kieran Kunhya <kieran@kunhya.com>
*
static int open_file( char *psz_filename, hnd_t *p_handle, cli_output_opt_t *opt )
{
- flv_hnd_t *p_flv = malloc( sizeof(*p_flv) );
- *p_handle = NULL;
- if( !p_flv )
- return -1;
- memset( p_flv, 0, sizeof(*p_flv) );
-
- p_flv->b_dts_compress = opt->use_dts_compress;
-
- p_flv->c = flv_create_writer( psz_filename );
- if( !p_flv->c )
- return -1;
-
- CHECK( write_header( p_flv->c ) );
- *p_handle = p_flv;
+ flv_hnd_t *p_flv = calloc( 1, sizeof(flv_hnd_t) );
+ if( p_flv )
+ {
+ flv_buffer *c = flv_create_writer( psz_filename );
+ if( c )
+ {
+ if( !write_header( c ) )
+ {
+ p_flv->c = c;
+ p_flv->b_dts_compress = opt->use_dts_compress;
+ *p_handle = p_flv;
+ return 0;
+ }
+
+ fclose( c->fp );
+ free( c->data );
+ free( c );
+ }
+ free( p_flv );
+ }
- return 0;
+ *p_handle = NULL;
+ return -1;
}
static int set_param( hnd_t handle, x264_param_t *p_param )
return i_size;
}
-static void rewrite_amf_double( FILE *fp, uint64_t position, double value )
+static int rewrite_amf_double( FILE *fp, uint64_t position, double value )
{
uint64_t x = endian_fix64( flv_dbl2int( value ) );
- fseek( fp, position, SEEK_SET );
- fwrite( &x, 8, 1, fp );
+ return !fseek( fp, position, SEEK_SET ) && fwrite( &x, 8, 1, fp ) == 1 ? 0 : -1;
}
+#undef CHECK
+#define CHECK(x)\
+do {\
+ if( (x) < 0 )\
+ goto error;\
+} while( 0 )
+
static int close_file( hnd_t handle, int64_t largest_pts, int64_t second_largest_pts )
{
+ int ret = -1;
flv_hnd_t *p_flv = handle;
flv_buffer *c = p_flv->c;
if( p_flv->i_framerate_pos )
{
framerate = (double)p_flv->i_framenum / total_duration;
- rewrite_amf_double( c->fp, p_flv->i_framerate_pos, framerate );
+ CHECK( rewrite_amf_double( c->fp, p_flv->i_framerate_pos, framerate ) );
}
- rewrite_amf_double( c->fp, p_flv->i_duration_pos, total_duration );
- rewrite_amf_double( c->fp, p_flv->i_filesize_pos, filesize );
- rewrite_amf_double( c->fp, p_flv->i_bitrate_pos, filesize * 8 / ( total_duration * 1000 ) );
+ CHECK( rewrite_amf_double( c->fp, p_flv->i_duration_pos, total_duration ) );
+ CHECK( rewrite_amf_double( c->fp, p_flv->i_filesize_pos, filesize ) );
+ CHECK( rewrite_amf_double( c->fp, p_flv->i_bitrate_pos, filesize * 8 / ( total_duration * 1000 ) ) );
}
+ ret = 0;
+error:
fclose( c->fp );
- free( p_flv );
+ free( c->data );
free( c );
+ free( p_flv );
- return 0;
+ return ret;
}
const cli_output_t flv_output = { open_file, set_param, write_headers, write_frame, close_file };