diff --git a/mythtv/libs/libavcodec/bswap.h b/mythtv/libs/libavcodec/bswap.h index 460f7abd401..2ebdf15af3f 100644 --- a/mythtv/libs/libavcodec/bswap.h +++ b/mythtv/libs/libavcodec/bswap.h @@ -107,6 +107,18 @@ static inline uint64_t ByteSwap64(uint64_t x) #endif /* !HAVE_BYTESWAP_H */ +static inline double bswap_dbl(double x) +{ + union { + uint32_t l[2]; + double d; + } t; + t.d = x; + t.l[0] = bswap_32(t.l[1]); + t.l[1] = bswap_32(t.l[0]); + return t.d; +} + // be2me ... BigEndian to MachineEndian // le2me ... LittleEndian to MachineEndian diff --git a/mythtv/libs/libmythtv/NuppelVideoRecorder.cpp b/mythtv/libs/libmythtv/NuppelVideoRecorder.cpp index 4fe9d861d19..0b549a7cf99 100644 --- a/mythtv/libs/libmythtv/NuppelVideoRecorder.cpp +++ b/mythtv/libs/libmythtv/NuppelVideoRecorder.cpp @@ -29,6 +29,10 @@ extern "C" { #include "videodev_myth.h" +#ifdef WORDS_BIGENDIAN +#include "bswap.h" +#endif + #ifndef MJPIOC_S_PARAMS #include "videodev_mjpeg.h" #endif @@ -1628,6 +1632,15 @@ void NuppelVideoRecorder::BufferIt(unsigned char *buf, int len) return; } +inline void NuppelVideoRecorder::WriteFrameheader(rtframeheader *fh) +{ +#ifdef WORDS_BIGENDIAN + fh->timecode = bswap_32(fh->timecode); + fh->packetlength = bswap_32(fh->packetlength); +#endif + ringBuffer->Write(fh, FRAMEHEADERSIZE); +} + void NuppelVideoRecorder::WriteHeader(void) { struct rtfileheader fileheader; @@ -1658,6 +1671,18 @@ void NuppelVideoRecorder::WriteHeader(void) fileheader.textsblocks = -1; // TODO: make only -1 if VBI support active? fileheader.keyframedist = KEYFRAMEDIST; +#ifdef WORDS_BIGENDIAN + fileheader.width = bswap_32(fileheader.width); + fileheader.height = bswap_32(fileheader.height); + fileheader.desiredwidth = bswap_32(fileheader.desiredwidth); + fileheader.desiredheight = bswap_32(fileheader.desiredheight); + fileheader.aspect = bswap_dbl(fileheader.aspect); + fileheader.fps = bswap_dbl(fileheader.fps); + fileheader.videoblocks = bswap_32(fileheader.videoblocks); + fileheader.audioblocks = bswap_32(fileheader.audioblocks); + fileheader.textsblocks = bswap_32(fileheader.textsblocks); + fileheader.keyframedist = bswap_32(fileheader.keyframedist); +#endif ringBuffer->Write(&fileheader, FILEHEADERSIZE); memset(&frameheader, 0, sizeof(frameheader)); @@ -1668,7 +1693,7 @@ void NuppelVideoRecorder::WriteHeader(void) frameheader.comptype = 'F'; frameheader.packetlength = mpa_ctx->extradata_size; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(mpa_ctx->extradata, frameheader.packetlength); } else @@ -1677,7 +1702,7 @@ void NuppelVideoRecorder::WriteHeader(void) frameheader.packetlength = sizeof(tbls); // compression configuration header - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); memset(tbls, 0, sizeof(tbls)); ringBuffer->Write(tbls, sizeof(tbls)); @@ -1688,7 +1713,7 @@ void NuppelVideoRecorder::WriteHeader(void) frameheader.packetlength = sizeof(extendeddata); // extended data header - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); struct extendeddata moredata; memset(&moredata, 0, sizeof(extendeddata)); @@ -1743,6 +1768,25 @@ void NuppelVideoRecorder::WriteHeader(void) extendeddataOffset = ringBuffer->GetFileWritePosition(); +#ifdef WORDS_BIGENDIAN + moredata.version = bswap_32(moredata.version); + moredata.video_fourcc = bswap_32(moredata.video_fourcc); + moredata.audio_fourcc = bswap_32(moredata.audio_fourcc); + moredata.audio_sample_rate = bswap_32(moredata.audio_sample_rate); + moredata.audio_bits_per_sample = bswap_32(moredata.audio_bits_per_sample); + moredata.audio_channels = bswap_32(moredata.audio_channels); + moredata.audio_compression_ratio = bswap_32(moredata.audio_compression_ratio); + moredata.audio_quality = bswap_32(moredata.audio_quality); + moredata.rtjpeg_quality = bswap_32(moredata.rtjpeg_quality); + moredata.rtjpeg_luma_filter = bswap_32(moredata.rtjpeg_luma_filter); + moredata.rtjpeg_chroma_filter = bswap_32(moredata.rtjpeg_chroma_filter); + moredata.lavc_bitrate = bswap_32(moredata.lavc_bitrate); + moredata.lavc_qmin = bswap_32(moredata.lavc_qmin); + moredata.lavc_qmax = bswap_32(moredata.lavc_qmax); + moredata.lavc_maxqdiff = bswap_32(moredata.lavc_maxqdiff); + moredata.seektable_offset = bswap_64(moredata.seektable_offset); + moredata.keyframeadjust_offset = bswap_64(moredata.keyframeadjust_offset); +#endif ringBuffer->Write(&moredata, sizeof(moredata)); last_block = 0; @@ -3264,14 +3308,14 @@ void NuppelVideoRecorder::WriteVideo(VideoFrame *frame, bool skipsync, frameheader.packetlength = 0; // no data packet frameheader.timecode = (fnum-startnum)>>1; // write video sync info - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); frameheader.frametype = 'S'; // sync frame frameheader.comptype = 'A'; // video sync information frameheader.filters = 0; // no filters applied frameheader.packetlength = 0; // no data packet frameheader.timecode = effectivedsp; // effective dsp frequency // write audio sync info - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); wantkeyframe = true; //ringBuffer->Sync(); @@ -3353,7 +3397,7 @@ void NuppelVideoRecorder::WriteVideo(VideoFrame *frame, bool skipsync, frameheader.packetlength = 0; // no additional data needed frameheader.frametype = 'V'; // last frame (or nullframe if first) frameheader.comptype = 'L'; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); // we don't calculate sizes for lost frames for compression computation dropped--; frameofgop++; @@ -3371,21 +3415,21 @@ void NuppelVideoRecorder::WriteVideo(VideoFrame *frame, bool skipsync, { frameheader.comptype = '0'; frameheader.packetlength = len; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(buf, len); } else if (hardware_encode) { frameheader.comptype = '4'; frameheader.packetlength = len; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(buf, len); } else { frameheader.comptype = '4'; frameheader.packetlength = tmp; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(strm, tmp); } } @@ -3395,14 +3439,14 @@ void NuppelVideoRecorder::WriteVideo(VideoFrame *frame, bool skipsync, { frameheader.comptype = '1'; // video compression: RTjpeg only frameheader.packetlength = tmp; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(strm, tmp); } else { frameheader.comptype = '0'; // raw YUV420 frameheader.packetlength = len; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(buf, len); // we write buf directly } } @@ -3413,7 +3457,7 @@ void NuppelVideoRecorder::WriteVideo(VideoFrame *frame, bool skipsync, else frameheader.comptype = '3'; // raw YUV420 with lzo frameheader.packetlength = out_len; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(out, out_len); } @@ -3539,7 +3583,7 @@ void NuppelVideoRecorder::WriteAudio(unsigned char *buf, int fnum, int timecode) if (frameheader.packetlength > 0) { - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(mp3buf, compressedsize); ringBuffer->Write(mp3gapless, gaplesssize); } @@ -3550,7 +3594,7 @@ void NuppelVideoRecorder::WriteAudio(unsigned char *buf, int fnum, int timecode) frameheader.comptype = '0'; // uncompressed audio frameheader.packetlength = audio_buffer_size; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(buf, audio_buffer_size); audiobytes += audio_buffer_size; // only audio no header!! } @@ -3563,7 +3607,7 @@ void NuppelVideoRecorder::WriteAudio(unsigned char *buf, int fnum, int timecode) frameheader.frametype = 'A'; // audio frame frameheader.comptype = 'N'; // output a nullframe with frameheader.packetlength = 0; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); audiobytes += audio_buffer_size; audio_behind--; } @@ -3584,7 +3628,7 @@ void NuppelVideoRecorder::WriteText(unsigned char *buf, int len, int timecode, frameheader.comptype = 'T'; // european teletext frameheader.packetlength = sizeof(int) + len; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(&pagenr, sizeof(int)); ringBuffer->Write(buf, len); } @@ -3593,7 +3637,7 @@ void NuppelVideoRecorder::WriteText(unsigned char *buf, int len, int timecode, frameheader.comptype = 'C'; // NTSC CC frameheader.packetlength = len; - ringBuffer->Write(&frameheader, FRAMEHEADERSIZE); + WriteFrameheader(&frameheader); ringBuffer->Write(buf, len); } } diff --git a/mythtv/libs/libmythtv/NuppelVideoRecorder.h b/mythtv/libs/libmythtv/NuppelVideoRecorder.h index 5d89d4420d0..8bf8a7fe2c5 100644 --- a/mythtv/libs/libmythtv/NuppelVideoRecorder.h +++ b/mythtv/libs/libmythtv/NuppelVideoRecorder.h @@ -102,6 +102,8 @@ class NuppelVideoRecorder : public RecorderBase void doVbiThread(void); private: + inline void NuppelVideoRecorder::WriteFrameheader(rtframeheader *fh); + void InitBuffers(void); void InitFilters(void); void ResizeVideoBuffers(void); diff --git a/mythtv/libs/libmythtv/nuppeldecoder.cpp b/mythtv/libs/libmythtv/nuppeldecoder.cpp index 90f5e8bf08f..c32031f1552 100644 --- a/mythtv/libs/libmythtv/nuppeldecoder.cpp +++ b/mythtv/libs/libmythtv/nuppeldecoder.cpp @@ -15,6 +15,11 @@ using namespace std; #include "minilzo.h" +#ifdef WORDS_BIGENDIAN +#include "bswap.h" +#endif + + pthread_mutex_t avcodeclock = PTHREAD_MUTEX_INITIALIZER; NuppelDecoder::NuppelDecoder(NuppelVideoPlayer *parent, MythSqlDatabase *db, @@ -116,6 +121,40 @@ QString NuppelDecoder::GetEncodingType(void) return (value); } +inline bool NuppelDecoder::ReadFileheader(rtfileheader *fh) +{ + if (ringBuffer->Read(fh, FILEHEADERSIZE) != FILEHEADERSIZE) + return false; + +#ifdef WORDS_BIGENDIAN + 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 WORDS_BIGENDIAN + fh->timecode = bswap_32(fh->timecode); + fh->packetlength = bswap_32(fh->packetlength); +#endif + + return true; +} + int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, char testbuf[2048]) { @@ -130,7 +169,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, char ftype; char *space; - if (ringBuffer->Read(&fileheader, FILEHEADERSIZE) != FILEHEADERSIZE) + if (!ReadFileheader(&fileheader)) { cerr << "Error reading file: " << ringBuffer->GetFilename() << endl; return -1; @@ -145,7 +184,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, startpos = ringBuffer->GetTotalReadPosition(); - if (ringBuffer->Read(&fileheader, FILEHEADERSIZE) != FILEHEADERSIZE) + if (!ReadFileheader(&fileheader)) { cerr << "Error reading file: " << ringBuffer->GetFilename() << endl; return -1; @@ -168,7 +207,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, 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 +257,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, startpos = ringBuffer->GetTotalReadPosition(); - ringBuffer->Read(&frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&frameheader); if (frameheader.frametype == 'X') { @@ -229,8 +268,28 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, else { ringBuffer->Read(&extradata, frameheader.packetlength); +#ifdef WORDS_BIGENDIAN + struct extendeddata *ed = &extradata; + 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 usingextradata = true; - ringBuffer->Read(&frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&frameheader); } } @@ -244,7 +303,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, perror("seek"); } - ringBuffer->Read(&seek_frameheader, FRAMEHEADERSIZE); + ReadFrameheader(&seek_frameheader); if (seek_frameheader.frametype != 'Q') { @@ -270,6 +329,10 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, { memcpy(&ste, seekbuf + offset, sizeof(struct seektable_entry)); +#ifdef WORDS_BIGENDIAN + 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 +392,10 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, { memcpy(&kfate, kfa_buf + offset, sizeof(struct kfatable_entry)); +#ifdef WORDS_BIGENDIAN + 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 +436,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, startpos = ringBuffer->GetTotalReadPosition(); - if (ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) != FRAMEHEADERSIZE) + if (!ReadFrameheader(&frameheader)) { delete [] space; return -1; @@ -392,6 +459,10 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, effdsp = extradata.audio_sample_rate * 100; m_parent->SetEffDsp(effdsp); audio_samplerate = extradata.audio_sample_rate; +#ifdef WORDS_BIGENDIAN + // Why only if using extradata? + 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 +497,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, long long startpos2 = ringBuffer->GetTotalReadPosition(); - foundit = (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, - FRAMEHEADERSIZE)); + foundit = !ReadFrameheader(&frameheader); bool framesearch = false; @@ -447,8 +517,7 @@ int NuppelDecoder::OpenFile(RingBuffer *rbuffer, bool novideo, startpos2 = ringBuffer->GetTotalReadPosition(); - foundit = (FRAMEHEADERSIZE != ringBuffer->Read(&frameheader, - FRAMEHEADERSIZE)); + foundit = !ReadFrameheader(&frameheader); if (foundit) break; } @@ -818,7 +887,7 @@ void NuppelDecoder::GetFrame(int avignore) { long long currentposition = ringBuffer->GetTotalReadPosition(); - if ((ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) != FRAMEHEADERSIZE) + if (!ReadFrameheader(&frameheader) || (frameheader.frametype == 'Q') || (frameheader.frametype == 'K')) { ateof = true; @@ -837,8 +906,7 @@ void NuppelDecoder::GetFrame(int avignore) ringBuffer->Seek((long long)seeklen-FRAMEHEADERSIZE, SEEK_CUR); - if (ringBuffer->Read(&frameheader, FRAMEHEADERSIZE) - != FRAMEHEADERSIZE) + if (!ReadFrameheader(&frameheader)) { ateof = true; m_parent->SetEof(); @@ -1007,6 +1075,19 @@ void NuppelDecoder::GetFrame(int avignore) else { getrawframes = 0; +#ifdef WORDS_BIGENDIAN + // Why endian correct the audio buffer here? + // Don't big-endian clients have to do it in audiooutBlah.cpp? + 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); } diff --git a/mythtv/libs/libmythtv/nuppeldecoder.h b/mythtv/libs/libmythtv/nuppeldecoder.h index 95a21fca12d..02f2d7fa0fc 100644 --- a/mythtv/libs/libmythtv/nuppeldecoder.h +++ b/mythtv/libs/libmythtv/nuppeldecoder.h @@ -55,6 +55,9 @@ class NuppelDecoder : public DecoderBase QString GetEncodingType(void); private: + inline bool NuppelDecoder::ReadFileheader(struct rtfileheader *fileheader); + inline bool NuppelDecoder::ReadFrameheader(struct rtframeheader *frameheader); + bool DecodeFrame(struct rtframeheader *frameheader, unsigned char *lstrm, VideoFrame *frame); bool isValidFrametype(char type); @@ -78,6 +81,9 @@ class NuppelDecoder : public DecoderBase int video_width, video_height, video_size; double video_frame_rate; int audio_samplerate; +#ifdef WORDS_BIGENDIAN + int audio_bits_per_sample; +#endif int ffmpeg_extradatasize; char *ffmpeg_extradata; diff --git a/mythtv/libs/libmythtv/yuv2rgb.cpp b/mythtv/libs/libmythtv/yuv2rgb.cpp index 99bc80a3ecc..a48e54ef3e7 100644 --- a/mythtv/libs/libmythtv/yuv2rgb.cpp +++ b/mythtv/libs/libmythtv/yuv2rgb.cpp @@ -372,6 +372,19 @@ static void yuv420_argb32_non_mmx(unsigned char *image, unsigned char *py, int w, y, cb, cr, r_add, g_add, b_add, width2; int dstwidth; +// byte indices +#ifdef WORDS_BIGENDIAN +#define R_OI 1 +#define G_OI 2 +#define B_OI 3 +#define A_OI 0 +#else +#define R_OI 0 +#define G_OI 1 +#define B_OI 2 +#define A_OI 3 +#endif + // squelch a warning rgb_stride = y_stride = uv_stride; @@ -394,15 +407,15 @@ static void yuv420_argb32_non_mmx(unsigned char *image, unsigned char *py, b_add = C_BU * cb + (1 << (SCALE_BITS - 1)); /* output 4 pixels */ - RGBOUT(d1[0], d1[1], d1[2], y1_ptr[0]); - RGBOUT(d1[4], d1[5], d1[6], y1_ptr[1]); - RGBOUT(d2[0], d2[1], d2[2], y2_ptr[0]); - RGBOUT(d2[4], d2[5], d2[6], y2_ptr[1]); + RGBOUT(d1[R_OI], d1[G_OI], d1[B_OI], y1_ptr[0]); + RGBOUT(d1[R_OI+4], d1[G_OI+4], d1[B_OI+4], y1_ptr[1]); + RGBOUT(d2[R_OI], d2[G_OI], d2[B_OI], y2_ptr[0]); + RGBOUT(d2[R_OI+4], d2[G_OI+4], d2[B_OI+4], y2_ptr[1]); if (alphaones) - d1[3] = d1[7] = d2[3] = d2[7] = 0xff; + d1[A_OI] = d1[A_OI+4] = d2[A_OI] = d2[A_OI+4] = 0xff; else - d1[3] = d1[7] = d2[3] = d2[7] = 0; + d1[A_OI] = d1[A_OI+4] = d2[A_OI] = d2[A_OI+4] = 0; d1 += 8; d2 += 8; @@ -429,55 +442,68 @@ void rgb32_to_yuv420p(unsigned char *lum, unsigned char *cb, unsigned char *cr, int r, g, b, r1, g1, b1; unsigned char *p; +// byte indices +#ifdef WORDS_BIGENDIAN +#define R_II 3 +#define G_II 2 +#define B_II 1 +#define A_II 0 +#else +#define R_II 0 +#define G_II 1 +#define B_II 2 +#define A_II 3 +#endif + wrap = width; wrap4 = srcwidth * 4; p = src; for(y=0;y> SCALEBITS; - alpha[0] = p[3]; - - r = p[4]; - g = p[5]; - b = p[6]; + alpha[0] = p[A_II]; + + r = p[R_II+4]; + g = p[G_II+4]; + b = p[B_II+4]; r1 += r; g1 += g; b1 += b; lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g + FIX(0.11400) * b + ONE_HALF) >> SCALEBITS; - alpha[1] = p[7]; - + alpha[1] = p[A_II+4]; + p += wrap4; lum += wrap; alpha += wrap; - - r = p[0]; - g = p[1]; - b = p[2]; + + r = p[R_II]; + g = p[G_II]; + b = p[B_II]; r1 += r; g1 += g; b1 += b; lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g + FIX(0.11400) * b + ONE_HALF) >> SCALEBITS; - alpha[0] = p[3]; - - r = p[4]; - g = p[5]; - b = p[6]; + alpha[0] = p[A_II]; + + r = p[R_II+4]; + g = p[G_II+4]; + b = p[B_II+4]; r1 += r; g1 += g; b1 += b; lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g + FIX(0.11400) * b + ONE_HALF) >> SCALEBITS; - alpha[1] = p[7]; - + alpha[1] = p[A_II+4]; + cr[0] = ((- FIX(0.16874) * r1 - FIX(0.33126) * g1 + FIX(0.50000) * b1 + 4 * ONE_HALF - 1) >> (SCALEBITS + 2)) + 128; @@ -496,4 +522,3 @@ void rgb32_to_yuv420p(unsigned char *lum, unsigned char *cb, unsigned char *cr, alpha += wrap; } } - diff --git a/mythtv/settings.pro b/mythtv/settings.pro index d2f7d4fe652..2cb4f9341e3 100644 --- a/mythtv/settings.pro +++ b/mythtv/settings.pro @@ -96,8 +96,9 @@ CONFIG += using_joystick_menu #QMAKE_CXXFLAGS += `directfb-config --cflags` # Windows support -#CONFIG += win32 -#DEFINES += _WIN32 +win32 { + DEFINES += _WIN32 +} # Mac OS X support macx { @@ -105,6 +106,15 @@ macx { # 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 } # DirectX support @@ -120,3 +130,19 @@ macx { #CONFIG += using_xrandr #DEFINES += USING_XRANDR +# Please keep this CONFIG block as the last one +macx { + # Disable the Linux defaults. + # Most developers will already know to hand-edit these out, + # but for the lazy ones who didn't, we will do it for them :-) + CONFIG -= using_x11 + CONFIG -= using_xv + EXTRA_LIBS -= -L/usr/X11R6/lib -lXinerama -lXv -lX11 -lXext -lXxf86vm + CONFIG -= using_ivtv + DEFINES -= USING_IVTV + CONFIG -= using_oss + DEFINES -= USING_OSS + DEFINES -= USING_OPENGL_VSYNC + EXTRA_LIBS -= -lGL -lGLU + CONFIG -= using_opengl +}