34
35
int mpeg2layers23_bitrates[]={-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1};
36
37
int ValidateMPEGFrame(unsigned char *baseptr,int index, MPEGINFO *mpginfo);
38
int CheckMP3CRC(unsigned char *baseptr,int index,MPEGINFO *mpginfo,bool fix);
37
39
int ValidateID3v2Tag(unsigned char *baseptr,int index, MPEGINFO *mpginfo);
38
40
int ValidateAPEv2Tag(unsigned char *baseptr,int index, MPEGINFO *mpginfo);
76
78
iFrame+=ValidateID3v2Tag(baseptr,iFrame,mpginfo);
78
WriteToFile(hFile,(char *)baseptr,0,iFrame,iFileSize);
80
if(WriteToFile(hFile,(char *)baseptr,0,iFrame,iFileSize)==-1) return -1;
79
81
LastFrameWasMPEG=false;
104
106
iFrameSize=ValidateMPEGFrame(baseptr,iFrame,mpginfo);
105
107
if(iFrameSize!=-1) {
108
if(iFrameSize+iFrame<=iFileSize&&mpginfo->iLastMPEGLayer==3&&mpginfo->bLastFrameCRC) CheckMP3CRC(baseptr,iFrame,mpginfo,fix);
106
109
if(fix&&!WasFirstFrame) iFirstMPEGFrameOffset=CrossAPI_SetFilePointer(hFile,0,true);
108
WriteToFile(hFile,(char *)baseptr,iFrame,iFrameSize,iFileSize);
111
if(WriteToFile(hFile,(char *)baseptr,iFrame,iFrameSize,iFileSize)==-1) return -1;
109
112
LastFrameWasMPEG=true;
111
114
if(!WasFirstFrame) {
143
146
iFrameSize=ValidateAPEv2Tag(baseptr,iFrame,mpginfo);
145
WriteToFile(hFile,(char *)baseptr,iFrame,iFrameSize,iFileSize);
148
if(WriteToFile(hFile,(char *)baseptr,iFrame,iFrameSize,iFileSize)==-1) return -1;
146
149
LastFrameWasMPEG=false;
148
151
iFrame+=iFrameSize;
155
158
mpginfo->iTotalMPEGBytes-=WriteToFile(hFile,NULL,0,-1,-1);
158
WriteToFile(hFile,NULL,0,-1,-1);
161
if(WriteToFile(hFile,NULL,0,-1,-1)==-1) return -1;
161
164
else if(LastFrameWasMPEG) {
204
207
if(mpginfo->truncated>=0) {
206
WriteToFile(hFile,NULL,0,-1,-1);
209
if(WriteToFile(hFile,NULL,0,-1,-1)==-1) return -1;
207
210
if(LastFrameWasMPEG) {
208
211
mpginfo->iTotalMPEGBytes-=iFrameSize;
209
212
mpginfo->iDeletedFrames++;
218
if(fix&&mpginfo->id3v1) WriteToFile(hFile,(char *)baseptr,iID3v1Offset,128,-1);
221
if(fix&&mpginfo->id3v1) {
222
if(WriteToFile(hFile,(char *)baseptr,iID3v1Offset,128,-1)==-1) return -1;
220
225
if(fix) CrossAPI_SetEndOfFile(hFile);
224
229
if(mpginfo->BytesPresent&&mpginfo->FramesPresent) {
225
230
CrossAPI_SetFilePointer(hFile,iFirstMPEGFrameOffset+iXingOffset+12,false);
226
231
dwTemp=rotate_dword(mpeg_total-mpginfo->iDeletedFrames);
227
WriteToFile(hFile,(char *)&dwTemp,0,4,-1);
232
if(WriteToFile(hFile,(char *)&dwTemp,0,4,-1)==-1) return -1;
228
233
dwTemp=rotate_dword(mpginfo->iTotalMPEGBytes);
229
WriteToFile(hFile,(char *)&dwTemp,0,4,-1);
234
if(WriteToFile(hFile,(char *)&dwTemp,0,4,-1)==-1) return -1;
231
236
else if(mpginfo->BytesPresent) {
232
237
CrossAPI_SetFilePointer(hFile,iFirstMPEGFrameOffset+iXingOffset+12,false);
233
238
dwTemp=rotate_dword(mpginfo->iTotalMPEGBytes);
234
WriteToFile(hFile,(char *)&dwTemp,0,4,-1);
239
if(WriteToFile(hFile,(char *)&dwTemp,0,4,-1)==-1) return -1;
236
241
else if(mpginfo->FramesPresent) {
237
242
CrossAPI_SetFilePointer(hFile,iFirstMPEGFrameOffset+iXingOffset+12,false);
238
243
dwTemp=rotate_dword(mpeg_total-mpginfo->iDeletedFrames);
239
WriteToFile(hFile,(char *)&dwTemp,0,4,-1);
244
if(WriteToFile(hFile,(char *)&dwTemp,0,4,-1)==-1) return -1;
243
248
CrossAPI_SetFilePointer(hFile,iFirstMPEGFrameOffset+46,false);
244
249
dwTemp=rotate_dword(mpginfo->iTotalMPEGBytes);
245
WriteToFile(hFile,(char *)&dwTemp,0,4,-1);
250
if(WriteToFile(hFile,(char *)&dwTemp,0,4,-1)==-1) return -1;
246
251
dwTemp=rotate_dword(mpeg_total-mpginfo->iDeletedFrames);
247
WriteToFile(hFile,(char *)&dwTemp,0,4,-1);
252
if(WriteToFile(hFile,(char *)&dwTemp,0,4,-1)==-1) return -1;
251
256
if(fix) mpginfo->iErrors=1;
257
261
int ValidateMPEGFrame(unsigned char *baseptr,int index, MPEGINFO *mpginfo) {
382
398
return iFrameSize;
401
int CheckMP3CRC(unsigned char *baseptr,int index,MPEGINFO *mpginfo,bool fix) {
405
crc=CalculateCRC16(crc,0x8005,(char *)&baseptr[index+2],2);
407
if(mpginfo->LastFrameStereo) {
408
if(mpginfo->iLastMPEGVersion==1) {
416
if(mpginfo->iLastMPEGVersion==1) {
424
crc=CalculateCRC16(crc,0x8005,(char *)&baseptr[index+6],iSideInfoSize);
426
((char *)&storedcrc)[1]=baseptr[index+4];
427
((char *)&storedcrc)[0]=baseptr[index+5];
430
mpginfo->bCRCError=true;
431
mpginfo->iCRCErrors++;
433
baseptr[index+4]=((char *)&crc)[1];
434
baseptr[index+5]=((char *)&crc)[0];
385
441
int ValidateID3v2Tag(unsigned char *baseptr,int index, MPEGINFO *mpginfo) {