@ -194,6 +194,7 @@ static int get_params_size(
{
size_t total_size = 0 ;
size_t ps_count ;
int is_count_bad = 0 ;
size_t i ;
int status ;
status = CMVideoFormatDescriptionGetH264ParameterSetAtIndex ( vid_fmt ,
@ -203,11 +204,12 @@ static int get_params_size(
& ps_count ,
NULL ) ;
if ( status ) {
av_log ( avctx , AV_LOG_ERROR , " Error getting parameter set count: %d \n " , status ) ;
return AVERROR_EXTERNAL ;
is_count_bad = 1 ;
ps_count = 0 ;
status = 0 ;
}
for ( i = 0 ; i < ps_count ; i + + ) {
for ( i = 0 ; i < ps_count | | is_count_bad ; i + + ) {
const uint8_t * ps ;
size_t ps_size ;
status = CMVideoFormatDescriptionGetH264ParameterSetAtIndex ( vid_fmt ,
@ -216,14 +218,24 @@ static int get_params_size(
& ps_size ,
NULL ,
NULL ) ;
if ( status ) {
av_log ( avctx , AV_LOG_ERROR , " Error getting parameter set size for index %zd: %d \n " , i , status ) ;
return AVERROR_EXTERNAL ;
if ( status ) {
/*
* When ps_count is invalid , status ! = 0 ends the loop normally
* unless we didn ' t get any parameter sets .
*/
if ( i > 0 & & is_count_bad ) status = 0 ;
break ;
}
total_size + = ps_size + sizeof ( start_code ) ;
}
if ( status ) {
av_log ( avctx , AV_LOG_ERROR , " Error getting parameter set sizes: %d \n " , status ) ;
return AVERROR_EXTERNAL ;
}
* size = total_size ;
return 0 ;
}
@ -235,6 +247,7 @@ static int copy_param_sets(
size_t dst_size )
{
size_t ps_count ;
int is_count_bad = 0 ;
int status ;
size_t offset = 0 ;
size_t i ;
@ -246,11 +259,13 @@ static int copy_param_sets(
& ps_count ,
NULL ) ;
if ( status ) {
av_log ( avctx , AV_LOG_ERROR , " Error getting parameter set count for copying: %d \n " , status ) ;
return AVERROR_EXTERNAL ;
is_count_bad = 1 ;
ps_count = 0 ;
status = 0 ;
}
for ( i = 0 ; i < ps_count ; i + + ) {
for ( i = 0 ; i < ps_count | | is_count_bad ; i + + ) {
const uint8_t * ps ;
size_t ps_size ;
size_t next_offset ;
@ -262,8 +277,9 @@ static int copy_param_sets(
NULL ,
NULL ) ;
if ( status ) {
av_log ( avctx , AV_LOG_ERROR , " Error getting parameter set data for index %zd: %d \n " , i , status ) ;
return AVERROR_EXTERNAL ;
if ( i > 0 & & is_count_bad ) status = 0 ;
break ;
}
next_offset = offset + sizeof ( start_code ) + ps_size ;
@ -279,6 +295,11 @@ static int copy_param_sets(
offset = next_offset ;
}
if ( status ) {
av_log ( avctx , AV_LOG_ERROR , " Error getting parameter set data: %d \n " , status ) ;
return AVERROR_EXTERNAL ;
}
return 0 ;
}