예제 #1
0
PtrLList<Chunker::Fragment> * Chunker::fragmentBuffer (const void *pBuf, uint32 ui32Len, Type inputObjectType, uint8 ui8NoOfChunks, Type outputChunkType, uint8 ui8ChunkCompressionQuality)
{
    BMPImage *pBMPImage = NULL;
    if (inputObjectType == Chunker::BMP) {
        BufferReader br (pBuf, ui32Len, false);
        int rc;
        pBMPImage = new BMPImage();
        if (0 != (rc = pBMPImage->readHeaderAndImage (&br))) {
            checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                            "failed to read BMP image; rc = %d\n", rc);
            delete pBMPImage;
            return NULL;
        }
    }
    else if (inputObjectType == Chunker::JPEG) {
        pBMPImage = JPEGLibWrapper::convertJPEGToBMP (pBuf, ui32Len);
        if (pBMPImage == NULL) {
            checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                            "failed to convert JPEG image to BMP\n");
            return NULL;
        }
    }
    else if (inputObjectType == Chunker::JPEG2000) {
        #if defined (ANDROID)
            checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                            "JPEG2000 not supported on the Android platform\n");
            return NULL;
        #else
            BufferReader *pReader = JasperWrapper::convertToBMP (pBuf, ui32Len);
            if (pReader == NULL) {
                checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                "failed to convert JPEG2000 image to BMP\n");
                return NULL;
            }
            int rc;
            pBMPImage = new BMPImage();
            if (0 != (rc = pBMPImage->readHeaderAndImage (pReader))) {
                checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                "failed to read BMP image after converting JPEG2000 to BMP; rc = %d\n", rc);
                delete pBMPImage;
                delete pReader;
                return NULL;
            }
            delete pReader;
        #endif
    }
    else if (inputObjectType == Chunker::PNG) {
        #if defined (ANDROID)
            checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                            "JPEG2000 not supported on the Android platform\n");
            return NULL;
        #else
            pBMPImage = PNGLibWrapper::convertPNGToBMP (pBuf, ui32Len);
            if (pBMPImage == NULL) {
                checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                "failed to convert PNG image to BMP\n");
                return NULL;
            }
        #endif
    }
    else {
        checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                        "unsupported input type %d\n", (int) inputObjectType);
        return NULL;
    }
    PtrLList<Fragment> *pFragments = new PtrLList<Fragment>;
    for (uint8 ui8CurrentChunk = 1; ui8CurrentChunk <= ui8NoOfChunks; ui8CurrentChunk++) {
        BMPImage *pBMPChunk = BMPChunker::fragmentBMP (pBMPImage, ui8CurrentChunk, ui8NoOfChunks);
        if (pBMPChunk == NULL) {
            checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                            "failed to fragment BMP to create chunk %d of %d\n", (int) ui8CurrentChunk, (int) ui8NoOfChunks);
            delete pFragments;
            return NULL;
        }
        int rc;
        Fragment *pFragment = new Fragment();
        pFragment->src_type = inputObjectType;
        if (outputChunkType == Chunker::BMP) {
            BufferWriter bw (pBMPChunk->getTotalSize(), 1024);
            if (0 != (rc = pBMPChunk->writeHeaderAndImage (&bw))) {
                checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                "failed to write chunk BMP into buffer; rc = %d\n", rc);
                delete pFragments;
                return NULL;
            }
            uint32 ui32ChunkLen = bw.getBufferLength();
            pFragment->pReader = new BufferReader (bw.relinquishBuffer(), ui32ChunkLen, true);
            pFragment->ui64FragLen = ui32ChunkLen;
        }
        else if (outputChunkType == Chunker::JPEG) {
            BufferReader *pReader = JPEGLibWrapper::convertBMPToJPEG (pBMPChunk, ui8ChunkCompressionQuality);
            if (pReader == NULL) {
                checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                "failed to encode BMP chunk into JPEG\n");
                delete pFragments;
                return NULL;
            }
            pFragment->pReader = pReader;
            pFragment->ui64FragLen = pReader->getBytesAvailable();
        }
        else if (outputChunkType == Chunker::JPEG2000) {
            #if defined (ANDROID)
                checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                "JPEG2000 not supported on the Android platform\n");
                delete pFragments;
                return NULL;
            #else
                BufferWriter bw (pBMPChunk->getTotalSize(), 1024);
                if (0 != (rc = pBMPChunk->writeHeaderAndImage (&bw))) {
                    checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                    "failed to write chunk BMP into buffer for creating JPEG2000; rc = %d\n", rc);
                    delete pFragments;
                    return NULL;
                }
                BufferReader *pReader = JasperWrapper::convertToJPEG2000 (bw.getBuffer(), bw.getBufferLength());
                if (pReader == NULL) {
                    checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                                    "failed to encode BMP chunk into JPEG2000\n");
                    delete pFragments;
                    return NULL;
                }
                pFragment->pReader = pReader;
                pFragment->ui64FragLen = pReader->getBytesAvailable();
            #endif
        }
        else {
            checkAndLogMsg ("Chunker::fragmentBuffer", Logger::L_MildError,
                            "unsupported output type %d\n", (int) outputChunkType);
            return NULL;
        }
        pFragment->out_type = outputChunkType;
        pFragment->ui8Part = ui8CurrentChunk;
        pFragment->ui8TotParts = ui8NoOfChunks;
        pFragments->append (pFragment);
    }
    return pFragments;
}