/***************************************************************************** * Read and concatenate files *****************************************************************************/ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) { access_sys_t *p_sys = p_access->p_sys; if( p_sys->fd == -1 ) { /* no more data */ p_access->info.b_eof = true; return 0; } ssize_t i_ret = read( p_sys->fd, p_buffer, i_len ); if( i_ret > 0 ) { /* success */ p_sys->offset += i_ret; UpdateFileSize( p_access ); FindSeekpoint( p_access ); return i_ret; } else if( i_ret == 0 ) { /* check for new files in case the recording is still active */ if( p_sys->i_current_file >= FILE_COUNT - 1 ) ImportNextFile( p_access ); /* play next file */ SwitchFile( p_access, p_sys->i_current_file + 1 ); return -1; } else if( errno == EINTR ) { /* try again later */ return -1; } else { /* abort on read error */ msg_Err( p_access, "failed to read (%s)", vlc_strerror_c(errno) ); dialog_Fatal( p_access, _("File reading failed"), _("VLC could not read the file (%s)."), vlc_strerror(errno) ); SwitchFile( p_access, -1 ); return 0; } }
//! read data from bitstream, this is the only function to read data from file int32 bitstreamObject::refill() { PVMF_AMRPARSER_LOGDEBUG((0, "Refill In ipos=%d, iBytesRead=%d, iBytesProcessed=%d, iActualSize=%d, iFileSize=%d", iPos, iBytesRead, iBytesProcessed, iActual_size, iFileSize)); if (iBytesRead > 0 && iFileSize > 0 && iBytesRead >= iFileSize) { // if number of bytes read so far exceed the file size, // then first update the file size (PDL case). if (!UpdateFileSize()) return bitstreamObject::MISC_ERROR; //At this point we're within 32 bytes of the end of data. //Quit reading data but don't return EOF until all data is processed. if (iBytesProcessed < iBytesRead) { return bitstreamObject::EVERYTHING_OK; } else { //there is no more data to read. if (iBytesRead >= iFileSize || iBytesProcessed >= iFileSize) return bitstreamObject::END_OF_FILE; } } if (!ipAMRFile) { return bitstreamObject::MISC_ERROR; } // Get file size at the very first time if (iFileSize == 0) { if (ipAMRFile->Seek(0, Oscl_File::SEEKEND)) { return bitstreamObject::MISC_ERROR; } iFileSize = ipAMRFile->Tell(); if (iFileSize <= 0) { return bitstreamObject::MISC_ERROR; } if (ipAMRFile->Seek(0, Oscl_File::SEEKSET)) { return bitstreamObject::MISC_ERROR; } // first-time read, set the initial value of iPos iPos = bitstreamObject::SECOND_BUFF_SIZE; iBytesProcessed = 0; } // we are currently positioned at the end of the data buffer. else if (iPos == bitstreamObject::MAIN_BUFF_SIZE + bitstreamObject::SECOND_BUFF_SIZE) { // reset iPos and refill from the beginning of the buffer. iPos = bitstreamObject::SECOND_BUFF_SIZE; } else if (iPos >= iActual_size) { int32 len = 0; // move the remaining stuff to the beginning of iBuffer if (iActual_size + bitstreamObject::SECOND_BUFF_SIZE > iPos) { // we are currently positioned within SECOND_BUFF_SIZE bytes from the end of the buffer. len = iActual_size + bitstreamObject::SECOND_BUFF_SIZE - iPos; } else { // no leftover data. len = 0; } oscl_memcpy(&iBuffer[bitstreamObject::SECOND_BUFF_SIZE-len], &iBuffer[iPos], len); iPos = bitstreamObject::SECOND_BUFF_SIZE - len; // update the file size for the PDL scenario where more data has been downloaded // into the file but the file size has not been updated yet. if (iBytesRead + iMax_size > iFileSize) { if (!UpdateFileSize()) return bitstreamObject::MISC_ERROR; } } // read data if ((iActual_size = ipAMRFile->Read(&iBuffer[bitstreamObject::SECOND_BUFF_SIZE], 1, iMax_size)) == 0) { return bitstreamObject::READ_ERROR; } iBytesRead += iActual_size; PVMF_AMRPARSER_LOGDEBUG((0, "Refill Out ipos=%d, iBytesRead=%d, iBytesProcessed=%d, iActualSize=%d, iFileSize=%d", iPos, iBytesRead, iBytesProcessed, iActual_size, iFileSize)); return bitstreamObject::EVERYTHING_OK; }