示例#1
0
int main ( void )
{
    //FILE *fp;
    //FILE *fpout;
    unsigned char status;
    pjpeg_image_info_t pInfo;
    unsigned int sum;
    //unsigned int ra;
    unsigned int rb;
    //unsigned int x,rx;
    //unsigned int y,ry;


    //fp=fopen("base.bmp","rb");
    //if(fp==NULL) return(1);
    //dlen=fread(odat,1,122,fp);
    //fclose(fp);
    //if(dlen!=122) return(1);
    //fpout=fopen("out.bmp","wb");
    //if(fpout==NULL) return(1);
    //fwrite(odat,1,122,fpout);


    doff=0;

    status = pjpeg_decode_init(&pInfo, pjpeg_need_bytes_callback, NULL,0);

    if (status)
    {
        printf("pjpeg_decode_init() failed with status %u\n", status);
        return(1);
    }
    //x=0;
    //y=128-1;
    sum=0;
    while(status==0)
    {
        status=pjpeg_decode_mcu();
        //printf("decode %u\n",ra);
        if(status==0)
        {
            switch(pInfo.m_scanType)
            {
                case PJPG_GRAYSCALE: break;
                case PJPG_YH1V1:
                {
                    //rx=0;
                    //ry=0;
                    for(rb=0;rb<64;rb++)
                    {
                        sum+=pInfo.m_pMCUBufB[rb];
                        sum+=pInfo.m_pMCUBufG[rb];
                        sum+=pInfo.m_pMCUBufR[rb];
                        //odat[y-ry][x+rx][0]=pInfo.m_pMCUBufB[rb];
                        //odat[y-ry][x+rx][1]=pInfo.m_pMCUBufG[rb];
                        //odat[y-ry][x+rx][2]=pInfo.m_pMCUBufR[rb];
                        //rx++;
                        //if(rx>=8)
                        //{
                            //rx=0;
                            //ry++;
                        //}
                    }
                    //x+=8;
                    //if(x>=256)
                    //{
                        //y-=8;
                        //x=0;
                    //}
                    //// PJPG_H1V1: Each MCU contains is decoded to a single block of 8x8 RGB pixels.
////   unsigned char *m_pMCUBufR;
                    //for(rb=0;rb<64;rb++) sum+=pInfo.m_pMCUBufR[rb];
                    //fwrite(pInfo.m_pMCUBufR,1,64,fpout);
                    //fwrite(pInfo.m_pMCUBufR,1,64,fp);
   ////unsigned char *m_pMCUBufG;
                    //for(rb=0;rb<64;rb++) sum+=pInfo.m_pMCUBufG[rb];
                    //fwrite(pInfo.m_pMCUBufG,1,64,fpout);
                    //fwrite(pInfo.m_pMCUBufG,1,64,fp);
   ////unsigned char *m_pMCUBufB;
                    //for(rb=0;rb<64;rb++) sum+=pInfo.m_pMCUBufB[rb];
                    //fwrite(pInfo.m_pMCUBufB,1,64,fpout);
                    //fwrite(pInfo.m_pMCUBufB,1,64,fp);
                    break;
                }
                case PJPG_YH2V1: break;
                case PJPG_YH1V2: break;
                case PJPG_YH2V2: break;
            }
        }
    }
    if(status!=PJPG_NO_MORE_BLOCKS)
    {
        printf("status %u\n",status);
        return(1);
    }
    printf("----\n");
    printf("%d\n",pInfo.m_width);
    printf("%d\n",pInfo.m_height);
    printf("%d\n",pInfo.m_comps);
    printf("%d\n",pInfo.m_MCUSPerRow);
    printf("%d\n",pInfo.m_MCUSPerCol);
    printf("%d\n",pInfo.m_scanType);
    printf("%d\n",pInfo.m_MCUWidth);
    printf("%d\n",pInfo.m_MCUHeight);
    printf("---- sum 0x%08X %u\n",sum,sum);


    //fwrite(odat,1,sizeof(odat),fpout);
    //fclose(fpout);

    return(0);
}
int JPEGDecoder::decode(char* pFilename, unsigned char pReduce){
    
    if(pReduce) reduce = pReduce;
    
    g_pInFile = SD.open(pFilename, FILE_READ);
    if (!g_pInFile)
        return -1;

    g_nInFileOfs = 0;

    g_nInFileSize = g_pInFile.size();
        
    status = pjpeg_decode_init(&image_info, pjpeg_callback, NULL, (unsigned char)reduce);
            
    if (status)
    {
        #ifdef DEBUG
        Serial.print("pjpeg_decode_init() failed with status ");
        Serial.println(status);
        
        if (status == PJPG_UNSUPPORTED_MODE)
        {
            Serial.println("Progressive JPEG files are not supported.");
        }
        #endif
        
        g_pInFile.close();
        return -1;
    }
    
    // In reduce mode output 1 pixel per 8x8 block.
    decoded_width = reduce ? (image_info.m_MCUSPerRow * image_info.m_MCUWidth) / 8 : image_info.m_width;
    decoded_height = reduce ? (image_info.m_MCUSPerCol * image_info.m_MCUHeight) / 8 : image_info.m_height;

    row_pitch = image_info.m_MCUWidth * image_info.m_comps;
    //pImage = (uint8 *)malloc(image_info.m_MCUWidth * image_info.m_MCUHeight * image_info.m_comps);
    pImage = new uint8[image_info.m_MCUWidth * image_info.m_MCUHeight * image_info.m_comps];
    if (!pImage)
    {
        g_pInFile.close();
        #ifdef DEBUG
        Serial.println("Memory Allocation Failure");
        #endif
        
        return -1;
    }
    memset(pImage , 0 , sizeof(pImage));

    row_blocks_per_mcu = image_info.m_MCUWidth >> 3;
    col_blocks_per_mcu = image_info.m_MCUHeight >> 3;
    
    is_available = 1 ;

    width = decoded_width;
    height = decoded_height;
    comps = image_info.m_comps;
    MCUSPerRow = image_info.m_MCUSPerRow;
    MCUSPerCol = image_info.m_MCUSPerCol;
    scanType = image_info.m_scanType;
    MCUWidth = image_info.m_MCUWidth;
    MCUHeight = image_info.m_MCUHeight;
    
    return decode_mcu();
}
示例#3
0
int JPEGDecoder::decode(File pInFile, unsigned char pReduce){
    
    if(pReduce) reduce = pReduce;
    
//  g_pInFile = SD.open(pFilename, FILE_READ);
    g_pInFile = pInFile;
    if (!g_pInFile){
        #ifdef DEBUG_JPEG
            Serial.println("failed to open jpeg file");
        #endif
        return -1;
    }
    g_nInFileOfs = 0;

    g_nInFileSize = g_pInFile.size();
    #ifdef DEBUG_JPEG
        Serial.print("file size = ");
        Serial.println(g_nInFileSize);
    #endif
        
    status = pjpeg_decode_init(&image_info, pjpeg_callback, NULL, (unsigned char)reduce);


    if (status)
    {
        #ifdef DEBUG_JPEG
        Serial.print("ERROR : pjpeg_decode_init() : ");
        /*
        switch(status & 63){
            case    PJPG_NO_MORE_BLOCKS:                Serial.print("NO_MORE_BLOCKS"); break;
            case    PJPG_BAD_DHT_COUNTS:                Serial.print("BAD_DHT_COUNTS"); break;
            case    PJPG_BAD_DHT_INDEX:                 Serial.print("BAD_DHT_INDEX"); break;
            case    PJPG_BAD_DHT_MARKER:                Serial.print("BAD_DHT_MARKER"); break;
            case    PJPG_BAD_DQT_MARKER:                Serial.print("BAD_DQT_MARKER"); break;
            case    PJPG_BAD_DQT_TABLE:                 Serial.print("BAD_DQT_TABLE"); break;
            case    PJPG_BAD_PRECISION:                 Serial.print("BAD_PRECISION"); break;
            case    PJPG_BAD_HEIGHT:                    Serial.print("BAD_HEIGHT"); break;
            case    PJPG_BAD_WIDTH:                     Serial.print("BAD_WIDTH"); break;
            case    PJPG_TOO_MANY_COMPONENTS:           Serial.print("TOO_MANY_COMPONENTS"); break;
            case    PJPG_BAD_SOF_LENGTH:                Serial.print("BAD_SOF_LENGTH"); break;
            case    PJPG_BAD_VARIABLE_MARKER:           Serial.print("BAD_VARIABLE_MARKER"); break;
            case    PJPG_BAD_DRI_LENGTH:                Serial.print("BAD_DRI_LENGTH"); break;
            case    PJPG_BAD_SOS_LENGTH:                Serial.print("BAD_SOS_LENGTH"); break;
            case    PJPG_BAD_SOS_COMP_ID:               Serial.print("BAD_SOS_COMP_ID"); break;
            case    PJPG_W_EXTRA_BYTES_BEFORE_MARKER:   Serial.print("W_EXTRA_BYTES"); break;
            case    PJPG_NO_ARITHMITIC_SUPPORT:         Serial.print("ARITHMITIC"); break;
            case    PJPG_UNEXPECTED_MARKER:             Serial.print("UNEXPECTED_MARKER"); break;
            case    PJPG_NOT_JPEG:                      Serial.print("NOT_JPEG"); break;
            case    PJPG_UNSUPPORTED_MARKER:            Serial.print("UNSUPPORTED_MARKER"); break;
            case    PJPG_BAD_DQT_LENGTH:                Serial.print("BAD_DQT_LENGTH"); break;
            case    PJPG_TOO_MANY_BLOCKS:               Serial.print("TOO_MANY_BLOCKS"); break;
            case    PJPG_UNDEFINED_QUANT_TABLE:         Serial.print("QUANT_TABLE"); break;
            case    PJPG_UNDEFINED_HUFF_TABLE:          Serial.print("HUFF_TABLE"); break;
            case    PJPG_NOT_SINGLE_SCAN:               Serial.print("SINGLE_SCAN"); break;
            case    PJPG_UNSUPPORTED_COLORSPACE:        Serial.print("COLORSPACE"); break;
            case    PJPG_UNSUPPORTED_SAMP_FACTORS:      Serial.print("SAMP_FACTORS"); break;
            case    PJPG_DECODE_ERROR:                  Serial.print("DECODE_ERROR"); break;
            case    PJPG_BAD_RESTART_MARKER:            Serial.print("RESTART_MARKER"); break;
            case    PJPG_ASSERTION_ERROR:               Serial.print("ASSERTION"); break;
            case    PJPG_BAD_SOS_SPECTRAL:              Serial.print("SOS_SPECTRAL"); break;
            case    PJPG_BAD_SOS_SUCCESSIVE:            Serial.print("SOS_SUCCESSIVE"); break;
            case    PJPG_STREAM_READ_ERROR:             Serial.print("STREAM_READ_ERRO"); break;
            case    PJPG_NOTENOUGHMEM:                  Serial.print("NOTENOUGHMEM"); break;
            case    PJPG_UNSUPPORTED_COMP_IDENT:        Serial.print("COMP_IDENT"); break;
            case    PJPG_UNSUPPORTED_QUANT_TABLE:       Serial.print("QUANT_TABLE"); break;
            case    PJPG_UNSUPPORTED_MODE:              Serial.print("progressive JPEG"); break;
            default:
            Serial.print("Unknown");
                break;
        }
        */
        Serial.print(' ');
        Serial.print(status);
        Serial.print(' ');
        Serial.println(status,BIN);
        #endif
        
        g_pInFile.close();
        return -1;
    }
    #ifdef DEBUG_JPEG
    Serial.print("Width     :");
    Serial.println(image_info.m_width);
    Serial.print("Height    :");
    Serial.println(image_info.m_height);
    Serial.print("Components:");
    Serial.println(image_info.m_comps);
    Serial.print("MCU / row :");
    Serial.println(image_info.m_MCUSPerRow);
    Serial.print("MCU / col :");
    Serial.println(image_info.m_MCUSPerCol);
    Serial.print("Scan type :");
    Serial.println(image_info.m_scanType);
    Serial.print("MCU width :");
    Serial.println(image_info.m_MCUWidth);
    Serial.print("MCU height:");
    Serial.println(image_info.m_MCUHeight);
    Serial.println("");
    #endif
    
    // In reduce mode output 1 pixel per 8x8 block.
    decoded_width = reduce ? (image_info.m_MCUSPerRow * image_info.m_MCUWidth) / 8 : image_info.m_width;
    decoded_height = reduce ? (image_info.m_MCUSPerCol * image_info.m_MCUHeight) / 8 : image_info.m_height;

    row_pitch = image_info.m_MCUWidth * image_info.m_comps;
    //pImage = (uint8 *)malloc(image_info.m_MCUWidth * image_info.m_MCUHeight * image_info.m_comps);
    pImage = new uint8[image_info.m_MCUWidth * image_info.m_MCUHeight * image_info.m_comps];
    if (!pImage)
    {
        g_pInFile.close();
        #ifdef DEBUG_JPEG
        Serial.println("Memory Allocation Failure");
        #endif
        
        return -1;
    }
    // memset(pImage , 0 , sizeof(pImage));
	memset(pImage , 0 , image_info.m_MCUWidth * image_info.m_MCUHeight * image_info.m_comps);

    row_blocks_per_mcu = image_info.m_MCUWidth >> 3;
    col_blocks_per_mcu = image_info.m_MCUHeight >> 3;
    
    is_available = 1 ;

    width = decoded_width;
    height = decoded_height;
    comps = image_info.m_comps;
    MCUSPerRow = image_info.m_MCUSPerRow;
    MCUSPerCol = image_info.m_MCUSPerCol;
    scanType = image_info.m_scanType;
    MCUWidth = image_info.m_MCUWidth;
    MCUHeight = image_info.m_MCUHeight;
    
    return decode_mcu();
}
示例#4
0
文件: picojpegtest.c 项目: hoangt/A2
int main ( void )
{
    unsigned char status;
    pjpeg_image_info_t pInfo;
    unsigned int sum;
    unsigned int rb;



    doff=0;

    status = pjpeg_decode_init(&pInfo, pjpeg_need_bytes_callback,(void *)0,0);

    if (status)
    {
        return(1);
    }
    sum=0;
    while(status==0)
    {
        status=pjpeg_decode_mcu();
        //printf("decode %u\n",ra);
        if(status==0)
        {
            switch(pInfo.m_scanType)
            {
                case PJPG_GRAYSCALE: break;
                case PJPG_YH1V1:
                {
                    for(rb=0;rb<64;rb++)
                    {
                        sum+=pInfo.m_pMCUBufB[rb];
                        sum+=pInfo.m_pMCUBufG[rb];
                        sum+=pInfo.m_pMCUBufR[rb];
                    }
                    //// PJPG_H1V1: Each MCU contains is decoded to a single block of 8x8 RGB pixels.
////   unsigned char *m_pMCUBufR;
                    //for(rb=0;rb<64;rb++) sum+=pInfo.m_pMCUBufR[rb];
                    //fwrite(pInfo.m_pMCUBufR,1,64,fpout);
                    //fwrite(pInfo.m_pMCUBufR,1,64,fp);
   ////unsigned char *m_pMCUBufG;
                    //for(rb=0;rb<64;rb++) sum+=pInfo.m_pMCUBufG[rb];
                    //fwrite(pInfo.m_pMCUBufG,1,64,fpout);
                    //fwrite(pInfo.m_pMCUBufG,1,64,fp);
   ////unsigned char *m_pMCUBufB;
                    //for(rb=0;rb<64;rb++) sum+=pInfo.m_pMCUBufB[rb];
                    //fwrite(pInfo.m_pMCUBufB,1,64,fpout);
                    //fwrite(pInfo.m_pMCUBufB,1,64,fp);
                    break;
                }
                case PJPG_YH2V1: break;
                case PJPG_YH1V2: break;
                case PJPG_YH2V2: break;
            }
        }
    }
    if(status!=PJPG_NO_MORE_BLOCKS)
    {
        return(1);
    }
    printf("---- sum 0x%08X %u\n",sum,sum);
    return(0);
}
uint8_t *pjpeg_load_from_file(const char *pFilename, unsigned *x, unsigned *y, int *comps, pjpeg_scan_type_t *pScan_type, int reduce)
{
    pjpeg_image_info_t image_info;
    int mcu_x = 0;
    int mcu_y = 0;
    uint row_pitch;
    uint8_t *pImage;
    uint8_t status;
    uint decoded_width, decoded_height;
    uint row_blocks_per_mcu, col_blocks_per_mcu;
    
    *x = 0;
    *y = 0;
    *comps = 0;
    if (pScan_type) *pScan_type = PJPG_GRAYSCALE;
    
    g_pInFile = fopen(pFilename, "rb");
    if (!g_pInFile)
        return NULL;
    
    g_nInFileOfs = 0;
    
    fseek(g_pInFile, 0, SEEK_END);
    g_nInFileSize = ftell(g_pInFile);
    fseek(g_pInFile, 0, SEEK_SET);
    
    status = pjpeg_decode_init(&image_info, pjpeg_need_bytes_callback, NULL, (unsigned char)reduce);
    
    if (status)
    {
        printf("pjpeg_decode_init() failed with status %u\n", status);
        if (status == PJPG_UNSUPPORTED_MODE)
        {
            printf("Progressive JPEG files are not supported.\n");
        }
        
        fclose(g_pInFile);
        return NULL;
    }
    
    if (pScan_type)
        *pScan_type = image_info.m_scanType;
    
    // In reduce mode output 1 pixel per 8x8 block.
    decoded_width = reduce ? (image_info.m_MCUSPerRow * image_info.m_MCUWidth) / 8 : image_info.m_width;
    decoded_height = reduce ? (image_info.m_MCUSPerCol * image_info.m_MCUHeight) / 8 : image_info.m_height;
    
    row_pitch = decoded_width * 4;
    pImage = (uint8_t *)malloc(row_pitch * decoded_height);
    if (!pImage)
    {
        fclose(g_pInFile);
        return NULL;
    }
    
    row_blocks_per_mcu = image_info.m_MCUWidth >> 3;
    col_blocks_per_mcu = image_info.m_MCUHeight >> 3;
    
    for ( ; ; )
    {
        int y, x;
        uint8_t *pDst_row;
        
        status = pjpeg_decode_mcu();
        
        if (status)
        {
            if (status != PJPG_NO_MORE_BLOCKS)
            {
                printf("pjpeg_decode_mcu() failed with status %u\n", status);
                
                free(pImage);
                fclose(g_pInFile);
                return NULL;
            }
            
            break;
        }
        
        if (mcu_y >= image_info.m_MCUSPerCol)
        {
            free(pImage);
            fclose(g_pInFile);
            return NULL;
        }
        
        if (reduce)
        {
            // In reduce mode, only the first pixel of each 8x8 block is valid.
            pDst_row = pImage + mcu_y * col_blocks_per_mcu * row_pitch + mcu_x * row_blocks_per_mcu * image_info.m_comps;
            if (image_info.m_scanType == PJPG_GRAYSCALE)
            {
                *pDst_row = image_info.m_pMCUBufR[0];
            }
            else
            {
                uint y, x;
                for (y = 0; y < col_blocks_per_mcu; y++)
                {
                    uint src_ofs = (y * 128U);
                    for (x = 0; x < row_blocks_per_mcu; x++)
                    {
                        pDst_row[0] = image_info.m_pMCUBufR[src_ofs];
                        pDst_row[1] = image_info.m_pMCUBufG[src_ofs];
                        pDst_row[2] = image_info.m_pMCUBufB[src_ofs];
                        pDst_row += 3;
                        src_ofs += 64;
                    }
                    
                    pDst_row += row_pitch - 3 * row_blocks_per_mcu;
                }
            }
        }
        else
        {
            // Copy MCU's pixel blocks into the destination bitmap.
            pDst_row = pImage + (mcu_y * image_info.m_MCUHeight) * row_pitch + (mcu_x * image_info.m_MCUWidth * 4);
            
            for (y = 0; y < image_info.m_MCUHeight; y += 8)
            {
                const int by_limit = min(8, image_info.m_height - (mcu_y * image_info.m_MCUHeight + y));
                
                for (x = 0; x < image_info.m_MCUWidth; x += 8)
                {
                    uint8_t *pDst_block = pDst_row + x * 4;
                    
                    // Compute source byte offset of the block in the decoder's MCU buffer.
                    uint src_ofs = (x * 8U) + (y * 16U);
                    const uint8_t *pSrcR = image_info.m_pMCUBufR + src_ofs;
                    const uint8_t *pSrcG = image_info.m_pMCUBufG + src_ofs;
                    const uint8_t *pSrcB = image_info.m_pMCUBufB + src_ofs;
                    
                    const int bx_limit = min(8, image_info.m_width - (mcu_x * image_info.m_MCUWidth + x));
                    
                    if (image_info.m_scanType == PJPG_GRAYSCALE)
                    {
                        int bx, by;
                        for (by = 0; by < by_limit; by++)
                        {
                            uint8_t *pDst = pDst_block;
                            
                            for (bx = 0; bx < bx_limit; bx++)
                            {
                                *pDst++ = *pSrcR;
                                *pDst++ = *pSrcR;
                                *pDst++ = *pSrcR++;
                                *pDst++ = 0xFF;
                            }
                            
                            pSrcR += (8 - bx_limit);
                            
                            pDst_block += row_pitch;
                        }
                    }
                    else
                    {
                        int bx, by;
                        for (by = 0; by < by_limit; by++)
                        {
                            uint8_t *pDst = pDst_block;
                            
                            for (bx = 0; bx < bx_limit; bx++)
                            {
                                pDst[0] = *pSrcR++;
                                pDst[1] = *pSrcG++;
                                pDst[2] = *pSrcB++;
                                pDst[3] = 0xFF;
                                pDst += 4;
                            }
                            
                            pSrcR += (8 - bx_limit);
                            pSrcG += (8 - bx_limit);
                            pSrcB += (8 - bx_limit);
                            
                            pDst_block += row_pitch;
                        }
                    }
                }
                
                pDst_row += (row_pitch * 8);
            }
        }
        
        mcu_x++;
        if (mcu_x == image_info.m_MCUSPerRow)
        {
            mcu_x = 0;
            mcu_y++;
        }
    }
    
    fclose(g_pInFile);
    
    *x = decoded_width;
    *y = decoded_height;
    *comps = image_info.m_comps;
    
    return pImage;
}