@@ -191,7 +191,7 @@ int mapEdLen;
191
191
int mbEndFd ;
192
192
193
193
struct MBIdx intraDep [MAX_FRAME_NUM_IN_GOP ][MAX_MB_H ][MAX_MB_W ][MAX_DEP_MB ];
194
- struct MBIdx interDep [MAX_FRAME_NUM_IN_GOP ][MAX_MB_H ][MAX_MB_W ][MAX_DEP_MB ];
194
+ // struct MBIdx interDep[MAX_FRAME_NUM_IN_GOP][MAX_MB_H][MAX_MB_W][MAX_DEP_MB];
195
195
int interDepMask [MAX_FRAME_NUM_IN_GOP ][MAX_MB_H ][MAX_MB_W ];
196
196
197
197
/*load frame mb index from frame _stFrame to frame _edFrame*/
@@ -326,6 +326,7 @@ static void load_intra_frame_mb_dependency(int p_videoFileIndex, int _stFrame, i
326
326
}
327
327
}
328
328
}
329
+ LOGI (10 , "load_intra_frame_mb_dependency init done" );
329
330
//memset(intraDep, 0, sizeof(interDep[0][0][0][0])*MAX_FRAME_NUM_IN_GOP*MAX_MB_H*MAX_MB_W*MAX_DEP_MB);
330
331
while (fgets (aLine , 40 , gVideoCodecCtxList [p_videoFileIndex ]-> g_intraDepF ) != NULL ) {
331
332
//parse the line
@@ -355,25 +356,49 @@ static void load_intra_frame_mb_dependency(int p_videoFileIndex, int _stFrame, i
355
356
break ;
356
357
}
357
358
}
359
+ LOGI (10 , "load_intra_frame_mb_dependency finished\n" );
358
360
}
359
361
360
- static void load_inter_frame_mb_dependency (int p_videoFileIndex , int _stFrame , int _edFrame ) {
362
+ unsigned char * interDepMap , * interDepMapMove ;
363
+ long interDepMapLen ;
364
+ int interDepFd ;
365
+ void unload_inter_frame_mb_dependency (void ) {
366
+ close (interDepFd );
367
+ munmap (interDepMap , interDepMapLen );
368
+ }
369
+ static void load_inter_frame_mb_dependency (int p_videoFileIndex ) {
370
+ //mmap operation
371
+ struct stat sbuf ;
372
+ LOGI (10 , "+++++load_inter_frame_mb_dependency, file: %s" , gVideoCodecCtxList [p_videoFileIndex ]-> g_interDepFileName );
373
+ if ((interDepFd = open (gVideoCodecCtxList [p_videoFileIndex ]-> g_interDepFileName , O_RDONLY )) == -1 ) {
374
+ LOGE (1 , "file open error" );
375
+ exit (1 );
376
+ }
377
+ if (stat (gVideoCodecCtxList [p_videoFileIndex ]-> g_interDepFileName , & sbuf ) == -1 ) {
378
+ LOGE (1 , "stat error" );
379
+ exit (1 );
380
+ }
381
+ LOGI (10 , "file size: %ld" , sbuf .st_size );
382
+ //mbEndPos = mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
383
+ //mbEndPos = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
384
+ interDepMapLen = sbuf .st_size ;
385
+ interDepMap = mmap (0 , sbuf .st_size , PROT_READ , MAP_PRIVATE , interDepFd , 0 );
386
+ interDepMapMove = interDepMap ;
387
+ if (interDepMap == MAP_FAILED ) {
388
+ LOGE (1 , "mmap error" );
389
+ perror ("mmap error: " );
390
+ exit (1 );
391
+ }
392
+ LOGI (10 , "+++++load_inter_frame_mb_dependency finished, exit the function" );
393
+ }
394
+
395
+ /*static void load_inter_frame_mb_dependency(int p_videoFileIndex, int _stFrame, int _edFrame) {
361
396
char aLine[40], *aToken;
362
397
int l_idxF, l_idxH, l_idxW, l_depH, l_depW, l_curDepIdx;
363
398
LOGI(10, "load_inter_frame_mb_dependency for video %d: %d: %d\n", p_videoFileIndex, _stFrame, _edFrame);
364
399
if (gVideoCodecCtxList[p_videoFileIndex]->g_interDepF == NULL) {
365
400
LOGE(1, "no valid inter frame mb dependency!!!");
366
401
}
367
- /*for (l_idxF = 0; l_idxF < MAX_FRAME_NUM_IN_GOP; ++l_idxF) {
368
- for (l_idxH = 0; l_idxH < MAX_MB_H; ++l_idxH) {
369
- for (l_idxW = 0; l_idxW < MAX_MB_W; ++l_idxW) {
370
- for (l_curDepIdx = 0; l_curDepIdx < MAX_DEP_MB; ++l_curDepIdx) {
371
- interDep[l_idxF][l_idxH][l_idxW][l_curDepIdx].h = -1;
372
- interDep[l_idxF][l_idxH][l_idxW][l_curDepIdx].w = -1;
373
- }
374
- }
375
- }
376
- }*/
377
402
memset(interDep, 0, sizeof(interDep[0][0][0][0])*MAX_FRAME_NUM_IN_GOP*MAX_MB_H*MAX_MB_W*MAX_DEP_MB);
378
403
while (fgets(aLine, 40, gVideoCodecCtxList[p_videoFileIndex]->g_interDepF) != NULL) {
379
404
//get the frame number, mb position first
@@ -407,7 +432,7 @@ static void load_inter_frame_mb_dependency(int p_videoFileIndex, int _stFrame, i
407
432
break;
408
433
}
409
434
}
410
- }
435
+ }*/
411
436
412
437
long dcpMapLen ;
413
438
unsigned char * dcpPos , * dcpPosMove ;
@@ -506,7 +531,7 @@ static void load_pre_computation_result(int p_videoFileIndex, int _stFrame, int
506
531
load_frame_mb_stindex (p_videoFileIndex ); //the mb index position
507
532
load_frame_mb_edindex (p_videoFileIndex ); //the mb index position
508
533
load_intra_frame_mb_dependency (p_videoFileIndex , _stFrame , _edFrame ); //the intra-frame dependency
509
- load_inter_frame_mb_dependency (p_videoFileIndex , _stFrame , _edFrame ); //the inter-frame dependency
534
+ load_inter_frame_mb_dependency (p_videoFileIndex ); //the inter-frame dependency
510
535
load_gop_dc_pred_direction (p_videoFileIndex ); //the dc prediction direction
511
536
}
512
537
@@ -669,13 +694,6 @@ if we know the roi for the entire GOP, we can pre-calculate the needed mbs at ev
669
694
static void compute_mb_mask_from_inter_frame_dependency (int _stFrame , int _edFrame , int _stH , int _stW , int _edH , int _edW ) {
670
695
int l_i , l_j , l_k , l_m ;
671
696
LOGI (10 , "start of compute_mb_mask_from_inter_frame_dependency" );
672
- /*for (l_i = 0; l_i < MAX_FRAME_NUM_IN_GOP; ++l_i) {
673
- for (l_j = 0; l_j < MAX_MB_H; ++l_j) {
674
- for (l_k = 0; l_k < MAX_MB_W; ++l_k) {
675
- interDepMask[l_i][l_j][l_k] = 0;
676
- }
677
- }
678
- }*/
679
697
memset (interDepMask , 0 , sizeof (interDepMask [0 ][0 ][0 ])* MAX_FRAME_NUM_IN_GOP * MAX_MB_H * MAX_MB_W );
680
698
//from last frame in the GOP, going backwards to the first frame of the GOP
681
699
//1. mark the roi as needed
@@ -697,12 +715,13 @@ static void compute_mb_mask_from_inter_frame_dependency(int _stFrame, int _edFra
697
715
if (interDepMask [l_i - _stFrame ][l_j ][l_k ] == 1 ) {
698
716
for (l_m = 0 ; l_m < MAX_DEP_MB ; ++ l_m ) {
699
717
//mark the needed mb in the previous frame
700
- if ((interDep [ l_i - _stFrame ][ l_j ][ l_k ][ l_m ]. h < 0 ) || (interDep [ l_i - _stFrame ][ l_j ][ l_k ][ l_m ]. w < 0 ))
718
+ if ((* interDepMapMove < 0 ) || (* ( interDepMapMove + 1 ) < 0 ))
701
719
continue ;
702
- if ((interDep [ l_i - _stFrame ][ l_j ][ l_k ][ l_m ]. h == 0 ) && (interDep [ l_i - _stFrame ][ l_j ][ l_k ][ l_m ]. w == 0 ))
720
+ if ((* interDepMapMove == 0 ) && (* ( interDepMapMove + 1 ) == 0 ))
703
721
continue ;
704
- LOGI (20 , "%d,%d,%d,%d,%d,%d\n" , l_i , l_j , l_k , l_m , interDep [l_i - _stFrame ][l_j ][l_k ][l_m ].h , interDep [l_i - _stFrame ][l_j ][l_k ][l_m ].w );
705
- interDepMask [l_i - 1 - _stFrame ][interDep [l_i - _stFrame ][l_j ][l_k ][l_m ].h ][interDep [l_i - _stFrame ][l_j ][l_k ][l_m ].w ] = 1 ;
722
+ LOGI (20 , "%d,%d,%d,%d,%d,%d\n" , l_i , l_j , l_k , l_m , * interDepMapMove , * (interDepMapMove + 1 ));
723
+ interDepMask [l_i - 1 - _stFrame ][* interDepMapMove ][* (interDepMapMove + 1 )] = 1 ;
724
+ interDepMapMove += 2 ;
706
725
}
707
726
}
708
727
}
@@ -750,6 +769,11 @@ void dep_decode_a_video_packet(int p_videoFileIndex) {
750
769
AVFrame * l_videoFrame = avcodec_alloc_frame ();
751
770
int l_numOfDecodedFrames , l_frameType ;
752
771
int ti , tj ;
772
+ FILE * tmpF , * postF ;
773
+ unsigned char interDep [8 ];
774
+ char aLine [40 ], * aToken ;
775
+ unsigned char l_depH , l_depW , l_curDepIdx ;
776
+ int l_idxF , l_idxH , l_idxW ;
753
777
LOGI (10 , "dep_decode_a_video_packet for video: %d" , p_videoFileIndex );
754
778
while (av_read_frame (gFormatCtxDepList [p_videoFileIndex ], & gVideoPacketDepList [p_videoFileIndex ]) >= 0 ) {
755
779
if (gVideoPacketDepList [p_videoFileIndex ].stream_index == gVideoStreamIndexList [p_videoFileIndex ]) {
@@ -775,19 +799,50 @@ void dep_decode_a_video_packet(int p_videoFileIndex) {
775
799
if (gVideoCodecCtxDepList [p_videoFileIndex ]-> dump_dependency ) {
776
800
fprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_gopF , "%d:\n" , gVideoCodecCtxDepList [p_videoFileIndex ]-> dep_video_packet_num - 1 );
777
801
//TODO: fflush all the dependency files for previous gop, may not be necessary since we're closing these files
778
- fflush (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_gopF );
802
+ /* fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_gopF);
779
803
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbStPosF);
780
804
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbEdPosF);
781
805
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_dcPredF);
782
806
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_intraDepF);
783
- fflush (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepF );
807
+ fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_interDepF);*/
784
808
//close all dependency files for this GOP
785
809
fclose (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_gopF );
786
810
fclose (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosF );
787
811
fclose (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosF );
788
812
fclose (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredF );
789
813
fclose (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_intraDepF );
790
814
fclose (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepF );
815
+ //post processing for inter and intra frame dependency files to make them mmap compatible
816
+ sprintf (l_depInterFileName , "%s_inter_gop%d.txt.tmp" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
817
+ sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepFileName , "%s_inter_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
818
+ tmpF = fopen (l_depInterFileName , "r" );
819
+ postF = fopen (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepFileName , "w" );
820
+ LOGI (10 , "...........processing %s to %s" , l_depInterFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepFileName );
821
+ while (fgets (aLine , 40 , tmpF ) != NULL ) {
822
+ memset (interDep , 0 , 8 );
823
+ if ((aToken = strtok (aLine , ":" )) != NULL ) //get the frame number, mb position first
824
+ l_idxF = atoi (aToken );
825
+ if ((aToken = strtok (NULL , ":" )) != NULL )
826
+ l_idxH = atoi (aToken );
827
+ if ((aToken = strtok (NULL , ":" )) != NULL )
828
+ l_idxW = atoi (aToken );
829
+ //get the dependency mb
830
+ l_curDepIdx = 0 ;
831
+ do {
832
+ aToken = strtok (NULL , ":" );
833
+ if (aToken != NULL ) l_depH = (unsigned char ) atoi (aToken );
834
+ else break ;
835
+ aToken = strtok (NULL , ":" );
836
+ if (aToken != NULL ) l_depW = (unsigned char ) atoi (aToken );
837
+ else break ;
838
+ //put the dependencies into the array
839
+ interDep [l_curDepIdx ++ ] = l_depH ;
840
+ interDep [l_curDepIdx ++ ] = l_depW ;
841
+ } while (aToken != NULL );
842
+ fwrite (interDep , 1 , 8 , postF );
843
+ }
844
+ fclose (tmpF );
845
+ fclose (postF );
791
846
}
792
847
++ gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num ;
793
848
}
@@ -796,30 +851,32 @@ void dep_decode_a_video_packet(int p_videoFileIndex) {
796
851
#ifdef ANDROID_BUILD
797
852
sprintf (l_depGopRecFileName , "%s_goprec_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
798
853
sprintf (l_depIntraFileName , "%s_intra_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
799
- sprintf (l_depInterFileName , "%s_inter_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
854
+ sprintf (l_depInterFileName , "%s_inter_gop%d.txt.tmp" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
855
+ sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepFileName , "%s_inter_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
800
856
sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName , "%s_mbstpos_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
801
857
sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName , "%s_mbedpos_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
802
858
sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName , "%s_dcp_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
803
859
804
860
#else
805
861
sprintf (l_depGopRecFileName , "%s_goprec_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
806
862
sprintf (l_depIntraFileName , "%s_intra_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
807
- sprintf (l_depInterFileName , "%s_inter_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
863
+ sprintf (l_depInterFileName , "%s_inter_gop%d.txt.tmp" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
864
+ sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_interDepFileName , "%s_inter_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
808
865
sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName , "%s_mbstpos_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
809
866
sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName , "%s_mbedpos_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
810
867
sprintf (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName , "%s_dcp_gop%d.txt" , gVideoFileNameList [p_videoFileIndex ], gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
811
868
#endif
812
- LOGI (10 , "dependency files %s, %s, %s, %s, %s, %s for video %d gop %d" , l_depGopRecFileName , l_depIntraFileName , l_depInterFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName , p_videoFileIndex , gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
869
+ LOGI (10 , "dependency files %s, %s, %s, %s, %s, %s for video %d gop %d" , l_depGopRecFileName , l_depIntraFileName , gVideoCodecCtxDepList [ p_videoFileIndex ] -> g_interDepFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName , gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName , p_videoFileIndex , gVideoPacketQueueList [p_videoFileIndex ].dep_gop_num );
813
870
#ifdef CLEAR_DEP_BEFORE_START
814
871
remove (l_depGopRecFileName );
815
872
remove (l_depIntraFileName );
816
- remove (l_depInterFileName );
873
+ remove (gVideoCodecCtxDepList [ p_videoFileIndex ] -> g_depInterFileName );
817
874
remove (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName );
818
875
remove (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName );
819
876
remove (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName );
820
877
#endif
821
878
gVideoCodecCtxDepList [p_videoFileIndex ]-> dump_dependency = 1 ;
822
- if ((if_file_exists (l_depGopRecFileName )) && (if_file_exists (l_depIntraFileName )) && (if_file_exists (l_depInterFileName )) && (if_file_exists (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName )) && (if_file_exists (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName )) && (if_file_exists (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName ))) {
879
+ if ((if_file_exists (l_depGopRecFileName )) && (if_file_exists (l_depIntraFileName )) && (if_file_exists (gVideoCodecCtxDepList [ p_videoFileIndex ] -> g_interDepFileName )) && (if_file_exists (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbStPosFileName )) && (if_file_exists (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_mbEdPosFileName )) && (if_file_exists (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_dcPredFileName ))) {
823
880
//if all files exist, further check l_depGopRecFileName file content, see if it actually contains both GOP start and end frame
824
881
gVideoCodecCtxDepList [p_videoFileIndex ]-> g_gopF = fopen (l_depGopRecFileName , "r" );
825
882
if (load_gop_info (gVideoCodecCtxDepList [p_videoFileIndex ]-> g_gopF , & ti , & tj ) != 0 ) {
0 commit comments