Index: settings.pro =================================================================== RCS file: /var/lib/mythcvs/mythtv/settings.pro,v retrieving revision 1.66 diff -u -r1.66 settings.pro --- settings.pro 6 Sep 2004 16:14:38 -0000 1.66 +++ settings.pro 7 Sep 2004 06:13:44 -0000 @@ -102,6 +102,19 @@ # For source that uses config.h, CONFIG_DARWIN is defined. # For other source (e.g. libmythtv), we define this DEFINES += CONFIG_DARWIN + + # This .pro file doesn't include config.mak. Force processor architecture: + TARGET_ARCH_POWERPC=yes +} + +contains( TARGET_ARCH_POWERPC, yes ) { + # Source that has endian-specific code should include config.h, + # but until this happens, we define it here: + DEFINES += WORDS_BIGENDIAN + + # Most PPC frontends will talk to a little-endian backend (e.g. x86 Linux), + # so define this to swap around some words in the Myth data structures + DEFINES += SWAP_ENDIAN } # DirectX support 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 06:13:44 -0000 @@ -15,6 +15,11 @@ #include "minilzo.h" +#ifdef SWAP_ENDIAN +#include "bswap.h" +#endif + + pthread_mutex_t avcodeclock = PTHREAD_MUTEX_INITIALIZER; NuppelDecoder::NuppelDecoder(NuppelVideoPlayer *parent, MythSqlDatabase *db, @@ -116,6 +121,81 @@ return (value); } +#ifdef SWAP_ENDIAN +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 + +inline 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; +} + +inline 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; +} + +inline 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; +} + int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, char testbuf[2048]) { @@ -130,7 +210,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 +225,7 @@ startpos = ringBuffer->GetTotalReadPosition(); - if (ringBuffer->Read(&fileheader, FILEHEADERSIZE) != FILEHEADERSIZE) + if (!ReadFileheader(&fileheader)) { cerr << "Error reading file: " << ringBuffer->GetFilename() << endl; return -1; @@ -168,7 +248,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 +298,7 @@ startpos = ringBuffer->GetTotalReadPosition(); - ringBuffer->Read(&frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&frameheader); if (frameheader.frametype == 'X') { @@ -228,9 +308,9 @@ } else { - ringBuffer->Read(&extradata, frameheader.packetlength); + ReadExtradata(&extradata, frameheader.packetlength); usingextradata = true; - ringBuffer->Read(&frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&frameheader); } } @@ -244,7 +324,7 @@ perror("seek"); } - ringBuffer->Read(&seek_frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&seek_frameheader); if (seek_frameheader.frametype != 'Q') { @@ -270,6 +350,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 +413,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 +457,7 @@ startpos = ringBuffer->GetTotalReadPosition(); - if (ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) != FRAMEHEADERSIZE) + if (!ReadFrameheader(&frameheader)) { delete [] space; return -1; @@ -392,6 +480,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 +517,7 @@ long long startpos2 = ringBuffer->GetTotalReadPosition(); - foundit = (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, - FRAMEHEADERSIZE)); + foundit = ReadFrameheader(&frameheader); bool framesearch = false; @@ -447,8 +537,7 @@ startpos2 = ringBuffer->GetTotalReadPosition(); - foundit = (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, - FRAMEHEADERSIZE)); + foundit = ReadFrameheader(&frameheader); if (foundit) break; } @@ -818,7 +907,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 +926,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 +1095,17 @@ 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); } Index: libs/libmythtv/nuppeldecoder.h =================================================================== RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/nuppeldecoder.h,v retrieving revision 1.17 diff -u -r1.17 nuppeldecoder.h --- libs/libmythtv/nuppeldecoder.h 28 Aug 2004 07:52:12 -0000 1.17 +++ libs/libmythtv/nuppeldecoder.h 7 Sep 2004 06:13:44 -0000 @@ -55,6 +55,11 @@ QString GetEncodingType(void); private: + inline bool + NuppelDecoder::ReadFileheader(struct rtfileheader *fileheader), + NuppelDecoder::ReadFrameheader(struct rtframeheader *frameheader), + NuppelDecoder::ReadExtradata(struct extendeddata *extradata, int size); + bool DecodeFrame(struct rtframeheader *frameheader, unsigned char *lstrm, VideoFrame *frame); bool isValidFrametype(char type); @@ -78,6 +83,9 @@ int video_width, video_height, video_size; double video_frame_rate; int audio_samplerate; +#ifdef SWAP_ENDIAN + int audio_bits_per_sample; +#endif int ffmpeg_extradatasize; char *ffmpeg_extradata;