long MessageHandler::checkMessageAudio(long translationid, const MessageTranslation &mt) { int i; long audioid = -1; //cout << "Checking audio for messagetranslation " << mt.getText() << endl; //cout << "Audiocount " << mt.numAudio() << endl; for(i = 0; i < mt.numAudio(); i++) { const MessageAudio &ma = mt.getAudio(i); audioid = checkAudio(translationid, ma); if(audioid < 0) audioid = insertAudio(translationid, ma); } if(mt.numAudio() == 0) return 0; return audioid; }
uint8_t flvHeader::open(char *name) { uint32_t prevLen, type, size, pts,pos=0; _isvideopresent=0; _isaudiopresent=0; audioTrack=NULL; videoTrack=NULL; _filename=ADM_strdup(name); _fd=fopen(name,"rb"); if(!_fd) { printf("[FLV] Cannot open %s\n",name); return 0; } // Get size uint32_t fileSize=0; fseeko(_fd,0,SEEK_END); fileSize=ftello(_fd); fseeko(_fd,0,SEEK_SET); printf("[FLV] file size :%u bytes\n",fileSize); // It must begin by F L V 01 uint8_t four[4]; read(4,four); if(four[0]!='F' || four[1]!='L' || four[2]!='V') { printf("[FLV] Not a flv file %s\n",name); return 0; } // Next one is flags uint32_t flags=read8(); if(flags & 1) // VIDEO { _isvideopresent=1; printf("[FLV] Video flag\n"); }else { GUI_Info_HIG(ADM_LOG_INFO,"Warning","This FLV file says it has no video.\nI will assume it has and try to continue"); _isvideopresent=1; } if(flags & 4) // Audio { _isaudiopresent=1; printf("[FLV] Audio flag\n"); } // Skip header uint32_t skip=read32(); fseeko(_fd,skip,SEEK_SET); printf("[FLV] Skipping %u header bytes\n",skip); pos=ftello(_fd);; printf("pos:%u/%u\n",pos,fileSize); // Create our video index videoTrack=new flvTrak(50); if(_isaudiopresent) audioTrack=new flvTrak(50); else audioTrack=NULL; // Loop while(pos<fileSize-14) { pos=ftello(_fd); prevLen=read32(); type=read8(); size=read24(); pts=read24(); read32(); // ??? uint32_t remaining=size; //printf("[FLV] At %08x found type %x size %u pts%u\n",pos,type,size,pts); switch(type) { case FLV_TAG_TYPE_AUDIO: { if(!_isaudiopresent) { audioTrack=new flvTrak(50); _isaudiopresent=1; /* Damn lying headers...*/ }; uint8_t flags=read8(); int of=1+4+3+3+1+4; remaining--; int format=flags>>4; int fq=(flags>>2)&3; int bps=(flags>>1) & 1; int channel=(flags) & 1; if(!audioTrack->_nbIndex) // first frame.. { setAudioHeader(format,fq,bps,channel); } insertAudio(pos+of,remaining,pts); } break; case FLV_TAG_TYPE_VIDEO: { int of=1+4+3+3+1+4; uint8_t flags=read8(); remaining--; int frameType=flags>>4; int codec=(flags)&0xf; if(codec==FLV_CODECID_VP6) { read8(); // 1 byte of extraData remaining--; of++; } int first=0; if(!videoTrack->_nbIndex) first=1; insertVideo(pos+of,remaining,frameType,pts); if(first) // first frame.. { if(!setVideoHeader(codec,&remaining)) return 0; } } break; default: printf("[FLV]At 0x%x, unhandled type %u\n",pos,type); } Skip(remaining); } // while // Udpate frame count etc.. printf("[FLV] Found %u frames\n",videoTrack->_nbIndex); _videostream.dwLength= _mainaviheader.dwTotalFrames=videoTrack->_nbIndex; // Compute average fps float f=_videostream.dwLength; uint32_t duration=videoTrack->_index[videoTrack->_nbIndex-1].timeCode; if(duration) f=1000.*1000.*f/duration; else f=25000; _videostream.dwRate=(uint32_t)floor(f); _videostream.dwScale=1000; _mainaviheader.dwMicroSecPerFrame=ADM_UsecFromFps1000(_videostream.dwRate); printf("[FLV] Duration %u ms\n",videoTrack->_index[videoTrack->_nbIndex-1].timeCode); // _videostream.fccType=fourCC::get((uint8_t *)"vids"); _video_bih.biBitCount=24; _videostream.dwInitialFrames= 0; _videostream.dwStart= 0; videoTrack->_index[0].flags=AVI_KEY_FRAME; // audio track _audioStream=new flvAudio(name,audioTrack,&wavHeader); printf("[FLV]FLV successfully read\n"); return 1; }