Skip to content

Commit 6471c53

Browse files
committed
changed inter frame dependency file structure and implemented mmap
1 parent 3246e3b commit 6471c53

File tree

4 files changed

+93
-33
lines changed

4 files changed

+93
-33
lines changed

dependency.c

Lines changed: 89 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ int mapEdLen;
191191
int mbEndFd;
192192

193193
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];
195195
int interDepMask[MAX_FRAME_NUM_IN_GOP][MAX_MB_H][MAX_MB_W];
196196

197197
/*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
326326
}
327327
}
328328
}
329+
LOGI(10, "load_intra_frame_mb_dependency init done");
329330
//memset(intraDep, 0, sizeof(interDep[0][0][0][0])*MAX_FRAME_NUM_IN_GOP*MAX_MB_H*MAX_MB_W*MAX_DEP_MB);
330331
while (fgets(aLine, 40, gVideoCodecCtxList[p_videoFileIndex]->g_intraDepF) != NULL) {
331332
//parse the line
@@ -355,25 +356,49 @@ static void load_intra_frame_mb_dependency(int p_videoFileIndex, int _stFrame, i
355356
break;
356357
}
357358
}
359+
LOGI(10, "load_intra_frame_mb_dependency finished\n");
358360
}
359361

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) {
361396
char aLine[40], *aToken;
362397
int l_idxF, l_idxH, l_idxW, l_depH, l_depW, l_curDepIdx;
363398
LOGI(10, "load_inter_frame_mb_dependency for video %d: %d: %d\n", p_videoFileIndex, _stFrame, _edFrame);
364399
if (gVideoCodecCtxList[p_videoFileIndex]->g_interDepF == NULL) {
365400
LOGE(1, "no valid inter frame mb dependency!!!");
366401
}
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-
}*/
377402
memset(interDep, 0, sizeof(interDep[0][0][0][0])*MAX_FRAME_NUM_IN_GOP*MAX_MB_H*MAX_MB_W*MAX_DEP_MB);
378403
while (fgets(aLine, 40, gVideoCodecCtxList[p_videoFileIndex]->g_interDepF) != NULL) {
379404
//get the frame number, mb position first
@@ -407,7 +432,7 @@ static void load_inter_frame_mb_dependency(int p_videoFileIndex, int _stFrame, i
407432
break;
408433
}
409434
}
410-
}
435+
}*/
411436

412437
long dcpMapLen;
413438
unsigned char *dcpPos, *dcpPosMove;
@@ -506,7 +531,7 @@ static void load_pre_computation_result(int p_videoFileIndex, int _stFrame, int
506531
load_frame_mb_stindex(p_videoFileIndex); //the mb index position
507532
load_frame_mb_edindex(p_videoFileIndex); //the mb index position
508533
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
510535
load_gop_dc_pred_direction(p_videoFileIndex); //the dc prediction direction
511536
}
512537

@@ -669,13 +694,6 @@ if we know the roi for the entire GOP, we can pre-calculate the needed mbs at ev
669694
static void compute_mb_mask_from_inter_frame_dependency(int _stFrame, int _edFrame, int _stH, int _stW, int _edH, int _edW) {
670695
int l_i, l_j, l_k, l_m;
671696
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-
}*/
679697
memset(interDepMask, 0, sizeof(interDepMask[0][0][0])*MAX_FRAME_NUM_IN_GOP*MAX_MB_H*MAX_MB_W);
680698
//from last frame in the GOP, going backwards to the first frame of the GOP
681699
//1. mark the roi as needed
@@ -697,12 +715,13 @@ static void compute_mb_mask_from_inter_frame_dependency(int _stFrame, int _edFra
697715
if (interDepMask[l_i - _stFrame][l_j][l_k] == 1) {
698716
for (l_m = 0; l_m < MAX_DEP_MB; ++l_m) {
699717
//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))
701719
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))
703721
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;
706725
}
707726
}
708727
}
@@ -750,6 +769,11 @@ void dep_decode_a_video_packet(int p_videoFileIndex) {
750769
AVFrame *l_videoFrame = avcodec_alloc_frame();
751770
int l_numOfDecodedFrames, l_frameType;
752771
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;
753777
LOGI(10, "dep_decode_a_video_packet for video: %d", p_videoFileIndex);
754778
while (av_read_frame(gFormatCtxDepList[p_videoFileIndex], &gVideoPacketDepList[p_videoFileIndex]) >= 0) {
755779
if (gVideoPacketDepList[p_videoFileIndex].stream_index == gVideoStreamIndexList[p_videoFileIndex]) {
@@ -775,19 +799,50 @@ void dep_decode_a_video_packet(int p_videoFileIndex) {
775799
if (gVideoCodecCtxDepList[p_videoFileIndex]->dump_dependency) {
776800
fprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_gopF, "%d:\n", gVideoCodecCtxDepList[p_videoFileIndex]->dep_video_packet_num - 1);
777801
//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);
779803
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbStPosF);
780804
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbEdPosF);
781805
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_dcPredF);
782806
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_intraDepF);
783-
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_interDepF);
807+
fflush(gVideoCodecCtxDepList[p_videoFileIndex]->g_interDepF);*/
784808
//close all dependency files for this GOP
785809
fclose(gVideoCodecCtxDepList[p_videoFileIndex]->g_gopF);
786810
fclose(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbStPosF);
787811
fclose(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbEdPosF);
788812
fclose(gVideoCodecCtxDepList[p_videoFileIndex]->g_dcPredF);
789813
fclose(gVideoCodecCtxDepList[p_videoFileIndex]->g_intraDepF);
790814
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);
791846
}
792847
++gVideoPacketQueueList[p_videoFileIndex].dep_gop_num;
793848
}
@@ -796,30 +851,32 @@ void dep_decode_a_video_packet(int p_videoFileIndex) {
796851
#ifdef ANDROID_BUILD
797852
sprintf(l_depGopRecFileName, "%s_goprec_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
798853
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);
800856
sprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbStPosFileName, "%s_mbstpos_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
801857
sprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbEdPosFileName, "%s_mbedpos_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
802858
sprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_dcPredFileName, "%s_dcp_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
803859

804860
#else
805861
sprintf(l_depGopRecFileName, "%s_goprec_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
806862
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);
808865
sprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbStPosFileName, "%s_mbstpos_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
809866
sprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbEdPosFileName, "%s_mbedpos_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
810867
sprintf(gVideoCodecCtxDepList[p_videoFileIndex]->g_dcPredFileName, "%s_dcp_gop%d.txt", gVideoFileNameList[p_videoFileIndex], gVideoPacketQueueList[p_videoFileIndex].dep_gop_num);
811868
#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);
813870
#ifdef CLEAR_DEP_BEFORE_START
814871
remove(l_depGopRecFileName);
815872
remove(l_depIntraFileName);
816-
remove(l_depInterFileName);
873+
remove(gVideoCodecCtxDepList[p_videoFileIndex]->g_depInterFileName);
817874
remove(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbStPosFileName);
818875
remove(gVideoCodecCtxDepList[p_videoFileIndex]->g_mbEdPosFileName);
819876
remove(gVideoCodecCtxDepList[p_videoFileIndex]->g_dcPredFileName);
820877
#endif
821878
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))) {
823880
//if all files exist, further check l_depGopRecFileName file content, see if it actually contains both GOP start and end frame
824881
gVideoCodecCtxDepList[p_videoFileIndex]->g_gopF = fopen(l_depGopRecFileName, "r");
825882
if (load_gop_info(gVideoCodecCtxDepList[p_videoFileIndex]->g_gopF, &ti, &tj) != 0) {

dependency.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,5 @@ void load_frame_mb_edindex(int p_videoFileIndex);
114114
void unload_frame_mb_stindex(void);
115115
void unload_frame_mb_edindex(void);
116116
void unload_frame_dc_pred_direction(void);
117+
void unload_inter_frame_mb_dependency(void);
117118

ffplay.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ static void render_a_frame(int _width, int _height, float _roiSh, float _roiSw,
154154
unload_frame_mb_stindex();
155155
unload_frame_mb_edindex();
156156
unload_frame_dc_pred_direction();
157+
unload_inter_frame_mb_dependency();
157158
load_gop_info(gVideoCodecCtxList[gCurrentDecodingVideoFileIndex]->g_gopF, &gGopStart, &gGopEnd);
158159
}
159160
}
@@ -245,7 +246,7 @@ void *decode_video(void *arg) {
245246
}
246247
//load_frame_mb_stindex(0);
247248
#if defined(SELECTIVE_DECODING) || defined(NORM_DECODE_DEBUG)
248-
render_a_frame(800, 480, 0, 0, 1000, 1800); //decode frame
249+
render_a_frame(800, 480, 0, 0, 150, 800); //decode frame
249250
#else
250251
render_a_frame(800, 480, 0, 0, 100, 250); //decode frame
251252
#endif

libavcodec/avcodec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2931,6 +2931,7 @@ typedef struct AVCodecContext {
29312931
char g_mbEdPosFileName[100];
29322932
FILE *g_intraDepF;
29332933
FILE *g_interDepF;
2934+
char g_interDepFileName[100];
29342935
FILE *g_dcPredF;
29352936
char g_dcPredFileName[100];
29362937
FILE *g_gopF;

0 commit comments

Comments
 (0)