@@ -144,6 +144,7 @@ typedef struct _av_render {
144
144
145
145
media_lib_event_grp_handle_t event_group ;
146
146
media_lib_mutex_handle_t api_lock ;
147
+ uint32_t audio_threshold ;
147
148
av_render_event_cb event_cb ;
148
149
void * event_ctx ;
149
150
av_render_pool_data_free pool_free ;
@@ -688,6 +689,21 @@ static int a_render_body(av_render_thread_res_t *res, bool drop)
688
689
if (data .size ) {
689
690
int q_num = 0 , q_size = 0 ;
690
691
data_queue_query (res -> data_q , & q_num , & q_size );
692
+ if (res -> paused == false && res -> render -> audio_threshold ) {
693
+ if (res -> render -> a_render_res -> audio_rendered == false) {
694
+ if (q_size < res -> render -> audio_threshold ) {
695
+ data_queue_peek_unlock (res -> data_q );
696
+ // Wait for data reach threshold
697
+ media_lib_thread_sleep (10 );
698
+ return 0 ;
699
+ }
700
+ } else if (q_num < 3 ) {
701
+ res -> render -> a_render_res -> audio_rendered = false;
702
+ data_queue_peek_unlock (res -> data_q );
703
+ media_lib_thread_sleep (10 );
704
+ return 0 ;
705
+ }
706
+ }
691
707
audio_drop_before_render (res -> render , q_size , & skip );
692
708
}
693
709
if (drop == false && skip == false && (data .size || data .eos )) {
@@ -714,7 +730,7 @@ static int v_render_body(av_render_thread_res_t *res, bool drop)
714
730
if (vdec_res && vdec_res -> vid_convert ) {
715
731
// Do color convert firstly
716
732
ret = convert_color (vdec_res -> vid_convert ,
717
- data .data , data .size ,
733
+ data .data , data .size ,
718
734
vdec_res -> vid_convert_out , vdec_res -> vid_convert_out_size );
719
735
data .data = vdec_res -> vid_convert_out ;
720
736
data .size = vdec_res -> vid_convert_out_size ;
@@ -1086,7 +1102,7 @@ static int av_render_video_frame_reached(av_render_video_frame_t *frame, void *c
1086
1102
if (vdec_res && vdec_res -> vid_convert ) {
1087
1103
// Delay to malloc video convert output size
1088
1104
int image_size = convert_table_get_image_size (vdec_res -> out_fmt ,
1089
- v_render -> video_frame_info .width ,
1105
+ v_render -> video_frame_info .width ,
1090
1106
v_render -> video_frame_info .height );
1091
1107
uint8_t * vid_cvt_out = media_lib_realloc (vdec_res -> vid_convert_out , image_size );
1092
1108
if (vid_cvt_out == NULL ) {
@@ -1578,6 +1594,28 @@ int av_render_add_audio_data(av_render_handle_t h, av_render_audio_data_t *audio
1578
1594
return ret ;
1579
1595
}
1580
1596
1597
+ int av_render_set_audio_threshold (av_render_handle_t h , uint32_t audio_threshold )
1598
+ {
1599
+ av_render_t * render = (av_render_t * )h ;
1600
+ if (render == NULL ) {
1601
+ return -1 ;
1602
+ }
1603
+ media_lib_mutex_lock (render -> api_lock , MEDIA_LIB_MAX_LOCK_TIME );
1604
+ if (render -> cfg .audio_render_fifo_size == 0 ) {
1605
+ ESP_LOGW (TAG , "Not support set audio threshold without render fifo" );
1606
+ } else {
1607
+ uint32_t top_limit = render -> cfg .audio_render_fifo_size / 2 ;
1608
+ if (audio_threshold > top_limit ) {
1609
+ render -> audio_threshold = top_limit ;
1610
+ } else {
1611
+ render -> audio_threshold = audio_threshold ;
1612
+ }
1613
+ ESP_LOGE (TAG , "Set audio threshold %d" , (int )render -> audio_threshold );
1614
+ }
1615
+ media_lib_mutex_unlock (render -> api_lock );
1616
+ return 0 ;
1617
+ }
1618
+
1581
1619
int av_render_add_video_data (av_render_handle_t h , av_render_video_data_t * video_data )
1582
1620
{
1583
1621
av_render_t * render = (av_render_t * )h ;
0 commit comments