+++ /dev/null
-#include "stdafx.h"\r
-#include "help.h"\r
-#include "debug.h"\r
-\r
-// \8dÅ\91å\8cö\96ñ\90\94\82Ì\8eæ\93¾\r
-int gcd( int a, int b) {\r
- while (1) {\r
- int c = a % b;\r
- if( !c )\r
- return b;\r
- a = b;\r
- b = c;\r
- }\r
-}\r
-\r
-int CompareU64(const u64 *a, const u64 *b)\r
-{\r
- s64 diff = (s64)(*a - *b);\r
- return (diff > 0 ? 1: diff == 0 ? 0: -1);\r
-}\r
-\r
-int CompareTS_PTS(const T_TS_LIST *a, const T_TS_LIST *b)\r
-{\r
- s64 diff = (s64)(a->PTS - b->PTS);\r
- return (diff > 0 ? 1: diff == 0 ? 0: -1);\r
-}\r
-\r
-int CompareTS_Sample(const T_TS_LIST *a, const T_TS_LIST *b)\r
-{\r
- int diff = (int)(a->samples - b->samples);\r
- return (diff > 0 ? 1: diff == 0 ? 0: -1);\r
-}\r
-\r
-\r
-int SearchTrackOf4CC(T_MP4_INFO *mi, u32 *List4CC, int ListCount){\r
- u32 tgTrack = NULL;\r
- u32 tg4CC = NULL;\r
- for (int i = 1; i <= mi->i_trackCount; i++){\r
- tg4CC = gf_isom_get_media_subtype(mi->fp_in, i, 1);\r
- if (tg4CC == GF_ISOM_SUBTYPE_MPEG4)\r
- tg4CC = gf_isom_get_mpeg4_subtype(mi->fp_in, i, 1);\r
-\r
- DPRINTF("FOUR CC %s \r\n", gf_4cc_to_str(tg4CC));\r
-\r
- for (s32 k=0; k<ListCount; k++){\r
- if (tg4CC == List4CC[k]){\r
- tgTrack = i;\r
- break;\r
- }\r
- }\r
-\r
- if (tgTrack){\r
- mi->i_trackNo = tgTrack;\r
- mi->ui_4cc = tg4CC;\r
- break;\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-\r
-int readTsFromFile(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- int ret = 0;\r
-\r
- for(u32 i=0; i<mi->ui_sampleCount; i++){\r
- GF_ISOSample *sample = gf_isom_get_sample_info(mi->fp_in, mi->i_trackNo, i+1, NULL, NULL);\r
-\r
- if(!sample){\r
- ret = ErrorMessage(MSG_NO_SAMPLE);\r
- break;\r
- }\r
-\r
- ts[i].DTS = sample->DTS;\r
- ts[i].CTS_Offset = sample->CTS_Offset;\r
- ts[i].CTS = sample->DTS + sample->CTS_Offset;\r
- ts[i].PTS = ts[i].CTS - ts[0].CTS_Offset;\r
- ts[i].samples = i+1;\r
- gf_isom_sample_del(&sample);\r
- }\r
-\r
- return ret;\r
-}\r
-\r
-\r
-int getDelayFlame(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- int delay = 0;\r
- int maxDelay = 0;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- if(ts[i-1].CTS > ts[i].CTS){\r
- delay++;\r
- maxDelay = MAX(maxDelay, delay);\r
- } else {\r
- delay = 0;\r
- }\r
- }\r
-\r
- return maxDelay;\r
-}\r
-\r
-\r
-int getMinimumPTSDiff(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- int min_diff = INT_MAX;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- int diff = (int)(ts[i].PTS - ts[i-1].PTS);\r
- min_diff = MIN(min_diff, diff);\r
- }\r
- return min_diff;\r
-}\r
-\r
-int getMaximumPTSDiff(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- int max_diff = 0;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- int diff = (int)(ts[i].PTS - ts[i-1].PTS);\r
- max_diff = MAX(max_diff, diff);\r
- }\r
- return max_diff;\r
-}\r
-\r
-double getAveragePTSDiff(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- double avr_diff = 0.0;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- double diff = (double)(ts[i].PTS - ts[i-1].PTS);\r
- avr_diff += diff / (double)(mi->ui_sampleCount-1);\r
- }\r
- return avr_diff;\r
-}\r
-\r
-double getAverageFps(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- double base_fps = (double)mi->i_org_timescale / (double)(ts[1].PTS - ts[0].PTS);\r
- double sum_fps = 0;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- sum_fps += ((double)mi->i_org_timescale / (double)(ts[i].PTS - ts[i-1].PTS)) - base_fps;\r
- }\r
- return ((sum_fps / (double)mi->ui_sampleCount) + base_fps);\r
-}\r
-\r
-double getMaximumFps(T_MP4_INFO *mi, T_TS_LIST *ts){\r
- double max_fps = 0;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- double fps = (double)mi->i_org_timescale / (double)(ts[i].PTS - ts[i-1].PTS);\r
- max_fps = MAX(max_fps, fps);\r
- }\r
- return max_fps;\r
-}\r
-\r
-\r
-\r
-int readTimeCodeFromFile(T_MP4_INFO *mi, T_TS_LIST *ts, T_EDIT_PARAM *prm){\r
- FILE *fpin;\r
- int err = 0;\r
-\r
- if((fpin = fopen(prm->p_tcfile, "rb")) != NULL){\r
- printf("timecode\8eæ\8d\9e\92\86...\n");\r
-\r
- char buf1[256], buf2[256], buf3[256], buf4[256];\r
-\r
- /* read header */\r
- fscanf(fpin, "%s %s %s %s", buf1, buf2, buf3, buf4);\r
- if( _stricmp(buf2, "timecode") != 0 ||\r
- _stricmp(buf3, "format") != 0 ||\r
- _stricmp(buf4, "v2") != 0\r
- ){\r
- err = ErrorMessage(MSG_NO_V2);\r
- } else {\r
- u32 i = 0;\r
- double timeStamp = 0;\r
- bool enough = false;\r
- double *timeList = new double[mi->ui_sampleCount];\r
-\r
- // \83t\83@\83C\83\8b\82ð\93Ç\82Ý\8d\9e\82Ý\r
- while( fscanf(fpin, "%lf", &timeStamp) != EOF ){\r
- timeList[i] = timeStamp;\r
- i++;\r
- if (mi->ui_sampleCount <= i){\r
- enough = true;\r
- break;\r
- }\r
- }\r
-\r
- if (!enough) {\r
- err = ErrorMessage(MSG_NO_ENOUGH_FRAME);\r
- } else {\r
-\r
- double min_timeStamp = INT_MAX;\r
- // \8dÅ\8f¬\83^\83C\83~\83\93\83O\82ð\8eæ\93¾\r
- for(i=0; i<mi->ui_sampleCount - 1; i++){\r
- double tmp = timeList[i+1] - timeList[i];\r
- if(tmp > 0.0){\r
- int true_fps = (int)((double)prm->i_timerate / tmp + 0.5);\r
- if( true_fps > 0)\r
- tmp = (double)prm->i_timerate / (double)(true_fps);\r
- }\r
- min_timeStamp = MIN(min_timeStamp, tmp);\r
- }\r
- // \83G\83\89\81[\89ñ\94ð\r
- double max_fps = 1000.0 / MAX(min_timeStamp, 1.0);\r
- int timescale = int(max_fps * (double)prm->i_timerate * prm->f_mlt + 0.5);\r
-\r
- // timescale\96¢\8ew\92è\82Ì\8fê\8d\87\r
- if(prm->i_timescale <= 0){\r
- prm->i_timescale = timescale;\r
- prm->f_scaleFct = prm->f_mlt;\r
- } else {\r
- prm->f_scaleFct = ((double)prm->i_timescale / (double)timescale) * prm->f_mlt;\r
- }\r
-\r
- double timerate = prm->i_timerate;\r
- if (prm->f_scaleFct < 1.0)\r
- timerate = timerate * prm->f_scaleFct;\r
-\r
- for(i=0; i<mi->ui_sampleCount; i++){\r
- ts[i].PTS = u64( u64((double)prm->i_timescale * (timeList[i] / 1000.0) / timerate + 0.5) * timerate + 0.5);\r
- ts[i].CTS = ts[i].PTS;\r
- }\r
- }\r
-\r
- delete [] timeList;\r
- }\r
- }\r
- fclose(fpin);\r
- return err;\r
-}\r
-\r
-int readTimeCodeFromFileV1(T_MP4_INFO *mi, T_TS_LIST *ts, T_EDIT_PARAM *prm){\r
- FILE *fpin;\r
- int err = 0;\r
-\r
- if((fpin = fopen(prm->p_tcfile, "rb")) != NULL){\r
- printf("timecode\8eæ\8d\9e\92\86...\n");\r
-\r
- char buf1[256], buf2[256], buf3[256], buf4[256];\r
-\r
- /* read header */\r
- fscanf(fpin, "%s %s %s %s", buf1, buf2, buf3, buf4);\r
- if( _stricmp(buf2, "timecode") != 0 ||\r
- _stricmp(buf3, "format") != 0 ||\r
- _stricmp(buf4, "v1") != 0\r
- ){\r
- err = ErrorMessage(MSG_NO_V1);\r
- } else {\r
- double AssumeFps;\r
- fscanf(fpin, "%s %lf",buf1, &AssumeFps);\r
- if( _stricmp(buf1, "Assume") != 0)\r
- err = ErrorMessage(MSG_NO_V1);\r
- else {\r
- double fps;\r
- u32 st;\r
- u32 ed;\r
- s64 beforeCount = 0;\r
- bool enough = false;\r
- double *fpsList = new double[mi->ui_sampleCount];\r
-\r
-\r
- while( fscanf(fpin, "%d,%d,%lf", &st, &ed, &fps) != EOF ){\r
- \r
- for(u32 i=st+1; i<=ed+1; i++){\r
- if ((beforeCount + 1) != i){\r
- err = ErrorMessage(MSG_LOST_FRAME);\r
- break;\r
- }\r
- beforeCount = i;\r
- fpsList[i] = fps;\r
-\r
- if (mi->ui_sampleCount <= i+1)\r
- break;\r
- }\r
- if (mi->ui_sampleCount <= ed+1){\r
- enough = true;\r
- break;\r
- }\r
- }\r
- if (!enough) {\r
- err = ErrorMessage(MSG_NO_ENOUGH_FRAME);\r
- } else {\r
-\r
- double max_fps = 0.1;\r
- // \8dÅ\91åfps\82ð\8eæ\93¾\r
- for(u32 i=0; i<mi->ui_sampleCount; i++){\r
- max_fps = MAX(max_fps, fpsList[i]);\r
- }\r
- int timescale = int(max_fps * (double)prm->i_timerate * prm->f_mlt + 0.5);\r
-\r
- // timescale\96¢\8ew\92è\82Ì\8fê\8d\87\r
- if(prm->i_timescale <= 0){\r
- prm->i_timescale = timescale;\r
- prm->f_scaleFct = prm->f_mlt;\r
- } else {\r
- prm->f_scaleFct = ((double)prm->i_timescale / (double)timescale) * prm->f_mlt;\r
- }\r
-\r
- double timerate = prm->i_timerate;\r
- if (prm->f_scaleFct < 1.0)\r
- timerate = timerate * prm->f_scaleFct;\r
-\r
- // \90æ\93ª\82Í0\8cÅ\92è\r
- ts[0].PTS = 0;\r
- ts[0].CTS = 0;\r
- for(u32 i=1; i<mi->ui_sampleCount; i++){\r
- ts[i].PTS = ts[i-1].PTS + u64( u64(((double)prm->i_timescale / (fpsList[i] * timerate)) + 0.5) * timerate + 0.5);\r
- ts[i].CTS = ts[i].PTS;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- fclose(fpin);\r
- return err;\r
-}\r
-\r
-\r