Index: libs/libmythtv/nuppeldecoder.cpp =================================================================== RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/nuppeldecoder.cpp,v retrieving revision 1.49 diff -u -r1.49 nuppeldecoder.cpp --- libs/libmythtv/nuppeldecoder.cpp 3 Sep 2004 06:32:48 -0000 1.49 +++ libs/libmythtv/nuppeldecoder.cpp 7 Sep 2004 01:58:21 -0000 @@ -13,6 +13,21 @@ #include "mythcontext.h" #include "mythdbcon.h" +#ifdef SWAP_ENDIAN +#include "bswap.h" + +static inline double bswap_dbl(double x) +{ + union { + uint64_t ll; + double d; + } t; + t.d = x; + t.ll = bswap_64(t.ll); + return t.d; +} +#endif + #include "minilzo.h" pthread_mutex_t avcodeclock = PTHREAD_MUTEX_INITIALIZER; @@ -100,6 +115,68 @@ return false; } +bool NuppelDecoder::ReadFileheader(rtfileheader *fh) +{ + if ( ringBuffer->Read(fh, FILEHEADERSIZE) != FILEHEADERSIZE ) + return false; + +#ifdef SWAP_ENDIAN + fh->width = bswap_32(fh->width); + fh->height = bswap_32(fh->height); + fh->desiredwidth = bswap_32(fh->desiredwidth); + fh->desiredheight = bswap_32(fh->desiredheight); + fh->aspect = bswap_dbl(fh->aspect); + fh->fps = bswap_dbl(fh->fps); + fh->videoblocks = bswap_32(fh->videoblocks); + fh->audioblocks = bswap_32(fh->audioblocks); + fh->textsblocks = bswap_32(fh->textsblocks); + fh->keyframedist = bswap_32(fh->keyframedist); +#endif + + return true; +} + +bool NuppelDecoder::ReadFrameheader(rtframeheader *fh) +{ + if ( ringBuffer->Read(fh, FRAMEHEADERSIZE) != FRAMEHEADERSIZE ) + return false; + +#ifdef SWAP_ENDIAN + fh->timecode = bswap_32(fh->timecode); + fh->packetlength = bswap_32(fh->packetlength); +#endif + + return true; +} + +bool NuppelDecoder::ReadExtradata(struct extendeddata *ed, int size) +{ + if ( ringBuffer->Read(ed, size) != size ) + return false; + +#ifdef SWAP_ENDIAN + ed->version = bswap_32(ed->version); + ed->video_fourcc = bswap_32(ed->video_fourcc); + ed->audio_fourcc = bswap_32(ed->audio_fourcc); + ed->audio_sample_rate = bswap_32(ed->audio_sample_rate); + ed->audio_bits_per_sample = bswap_32(ed->audio_bits_per_sample); + ed->audio_channels = bswap_32(ed->audio_channels); + ed->audio_compression_ratio = bswap_32(ed->audio_compression_ratio); + ed->audio_quality = bswap_32(ed->audio_quality); + ed->rtjpeg_quality = bswap_32(ed->rtjpeg_quality); + ed->rtjpeg_luma_filter = bswap_32(ed->rtjpeg_luma_filter); + ed->rtjpeg_chroma_filter = bswap_32(ed->rtjpeg_chroma_filter); + ed->lavc_bitrate = bswap_32(ed->lavc_bitrate); + ed->lavc_qmin = bswap_32(ed->lavc_qmin); + ed->lavc_qmax = bswap_32(ed->lavc_qmax); + ed->lavc_maxqdiff = bswap_32(ed->lavc_maxqdiff); + ed->seektable_offset = bswap_64(ed->seektable_offset); + ed->keyframeadjust_offset = bswap_64(ed->keyframeadjust_offset); +#endif + + return true; +} + QString NuppelDecoder::GetEncodingType(void) { QString value = "Unknown"; @@ -130,7 +207,7 @@ char ftype; char *space; - if (ringBuffer->Read(&fileheader, FILEHEADERSIZE) != FILEHEADERSIZE) + if ( ! ReadFileheader(&fileheader) ) { cerr << "Error reading file: " << ringBuffer->GetFilename() << endl; return -1; @@ -145,7 +222,7 @@ startpos = ringBuffer->GetTotalReadPosition(); - if (ringBuffer->Read(&fileheader, FILEHEADERSIZE) != FILEHEADERSIZE) + if ( ! ReadFileheader(&fileheader) ) { cerr << "Error reading file: " << ringBuffer->GetFilename() << endl; return -1; @@ -168,7 +245,7 @@ keyframedist = fileheader.keyframedist; video_frame_rate = fileheader.fps; - if (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, FRAMEHEADERSIZE)) + if ( ! ReadFrameheader(&frameheader) ) { cerr << "File not big enough for a header\n"; return -1; @@ -218,7 +295,7 @@ startpos = ringBuffer->GetTotalReadPosition(); - ringBuffer->Read(&frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&frameheader); if (frameheader.frametype == 'X') { @@ -228,9 +305,9 @@ } else { - ringBuffer->Read(&extradata, frameheader.packetlength); + ReadExtradata(&extradata, frameheader.packetlength); usingextradata = true; - ringBuffer->Read(&frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&frameheader); } } @@ -244,7 +321,7 @@ perror("seek"); } - ringBuffer->Read(&seek_frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&seek_frameheader); if (seek_frameheader.frametype != 'Q') { @@ -270,6 +347,10 @@ { memcpy(&ste, seekbuf + offset, sizeof(struct seektable_entry)); +#ifdef SWAP_ENDIAN + ste.file_offset = bswap_64(ste.file_offset); + ste.keyframe_number = bswap_32(ste.keyframe_number); +#endif offset += sizeof(struct seektable_entry); PosMapEntry e = {ste.keyframe_number, @@ -329,6 +410,10 @@ { memcpy(&kfate, kfa_buf + offset, sizeof(struct kfatable_entry)); +#ifdef SWAP_ENDIAN + kfate.adjust = bswap_32(kfate.adjust); + kfate.keyframe_number = bswap_32(kfate.keyframe_number); +#endif offset += sizeof(struct kfatable_entry); keyFrameAdjustMap[kfate.keyframe_number] = kfate.adjust; @@ -369,7 +454,7 @@ startpos = ringBuffer->GetTotalReadPosition(); - if (ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) != FRAMEHEADERSIZE) + if ( ! ReadFrameheader(&frameheader) ) { delete [] space; return -1; @@ -392,6 +477,9 @@ effdsp = extradata.audio_sample_rate * 100; m_parent->SetEffDsp(effdsp); audio_samplerate = extradata.audio_sample_rate; +#ifdef SWAP_ENDIAN + audio_bits_per_sample = extradata.audio_bits_per_sample; +#endif m_parent->SetAudioParams(extradata.audio_bits_per_sample, extradata.audio_channels, extradata.audio_sample_rate); @@ -426,8 +514,7 @@ long long startpos2 = ringBuffer->GetTotalReadPosition(); - foundit = (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, - FRAMEHEADERSIZE)); + foundit = ReadFrameheader(&frameheader); bool framesearch = false; @@ -447,8 +534,7 @@ startpos2 = ringBuffer->GetTotalReadPosition(); - foundit = (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, - FRAMEHEADERSIZE)); + foundit = ReadFrameheader(&frameheader); if (foundit) break; } @@ -818,7 +904,7 @@ { long long currentposition = ringBuffer->GetTotalReadPosition(); - if ((ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) != FRAMEHEADERSIZE) + if ( ! ReadFrameheader(&frameheader) || (frameheader.frametype == 'Q') || (frameheader.frametype == 'K')) { ateof = true; @@ -837,8 +923,7 @@ ringBuffer->Seek((long long)seeklen-FRAMEHEADERSIZE, SEEK_CUR); - if (ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) - != FRAMEHEADERSIZE) + if ( ! ReadFrameheader(&frameheader) ) { ateof = true; m_parent->SetEof(); @@ -1007,6 +1092,19 @@ else { getrawframes = 0; +#ifdef SWAP_ENDIAN + if (audio_bits_per_sample == 16) { + // swap bytes + for (int i = 0; i < (frameheader.packetlength & ~1); + i += 2) + { + char tmp; + tmp = strm[i+1]; + strm[i+1] = strm[i]; + strm[i] = tmp; + } + } +#endif m_parent->AddAudioData((char *)strm, frameheader.packetlength, frameheader.timecode); }