📄 jpeg_encode.c
字号:
/*****************************************************************************
Copyright(c) 2005 Analog Devices, Inc. All Rights Reserved. This software is
proprietary and confidential to Analog Devices, Inc. and its licensors.
******************************************************************************
$RCSfile: jpeg_encode.c,v $
$Revision: 1.6 $
$Date: 2006/11/10 07:18:59 $
Project: BlackfinSDK (JPEG-MJPEG)
Title: JPEG encode
Author(s): ku, bmk
Revised by:
Description:
High level JPEG encoding functions
References:
None
******************************************************************************
Tab Setting: 4
Target Processor: ADSP-BF5xx
Target Tools Revision: ADSP VisualDSP++ v4.5
******************************************************************************
Modification History:
====================
$Log: jpeg_encode.c,v $
Revision 1.6 2006/11/10 07:18:59 bmk
merged BF533 & BF561 apps
Fixed BF561 caches issue
Revision 1.5 2006/11/03 07:12:15 bmk
SDK 2.0 files - Initial Entry
*****************************************************************************/
#include <jpeg_mjpeg_system.h> // JPEG-MJPEG System includes
#include <adi_usbio_blackfin.h> // USB I/O functions for Blackfin
#include <string.h> // string header
#include <math.h>
#include <cycle_count.h> // for basic cycle counting
// codec APIs
#include <JPEG_api_encoder.h>
#include <JPEG_BitsBuffer.h>
#include <IMG_common.h>
#include <JPEG_memalloc.h>
#include <jpeg_mjpeg_err.h>
// local prototype
int JPEG_encode(char* input_file);
// encoder settings (valid only for the JPEG encoder in this file)
// Width, Heigth and Quality Factor can be set through the specification file
static unsigned int QualityFactor = 40; // Input Desired Quality Factor
static unsigned int Threshold = 0;
static unsigned int EncodingMode = SEQUENTIAL;
/*********************************************************************
Function: do_JPEG_Encode
Description: File Handling for JPEG Encoding
*********************************************************************/
section("sdram0_bank1_nocache")
int do_JPEG_Encode(void)
{
char current_input_file_name[MAX_FILE_NAME_LEN+4];
static char current_path[MAX_PATH_NAME_LEN];
static char temp_path[MAX_PATH_NAME_LEN];
FILE *fp_jpg_dir; // file pointer to list file
int next_file = 1; // let next file value not be a null
char key;
int return_code = CODEC_SUCCESS;
printf("Blackfin(r) Multimedia Starter Kit - JPEG Encoder\n");
printf("(c) 2006 Analog Devices Inc.\n\n");
// Reset Video codecs
ResetVideoCodecs();
if (File_Settings == PROMPT_FOR_FILE_SETTINGS)
{
printf("Enter directory path to store JPEG file(s): ");
fflush(stdout);
scanf ("%s", current_path);
strcat(current_path,"\\");
printf("Name this JPEG file as: ");
fflush(stdout);
scanf ("%s", current_input_file_name);
}
else if (File_Settings == GET_FILE_SETTINGS_FROM_TXT_FILE)
{
// Open JPEG list-and-specification file
strcpy(current_path, SPEC_DIR);
fp_jpg_dir = fopen( strcat(current_path, JPEG_SPEC_FILE), "r" );
if (fp_jpg_dir == NULL)
{
fprintf( fperr, "Error: could not read specification file\n" );
return CODEC_FILE_ERROR;
}
printf("\nReading list of JPEG files and parameters from '%s'\n", JPEG_SPEC_FILE);
// loop through all the files in the list-file
// Get first File name from directory file
next_file = fscanf(fp_jpg_dir, "%s %d %d %d", current_input_file_name, &JPEGImageWidth, &JPEGImageHeight, &QualityFactor);
}
// Format a JPEG image buffer as ITU656 frame
if (VideoMode == ITU656_PAL)
// Format as PAL frame
adi_video_FrameFormat ((char *)pITU656Frames[0],PAL_IL);
else // VideoMode must be ITU656_NTSC
// Format as NTSC frame
adi_video_FrameFormat ((char *)pITU656Frames[0],NTSC_IL);
// continue till end of list or user selects to quit
while((next_file != EOF) && (next_file != (int)NULL))
{
if (File_Settings == PROMPT_FOR_FILE_SETTINGS)
{
printf("\n");
printf("Desired Image Size (Width) : ");
fflush(stdout);
scanf ("%d", &JPEGImageWidth);
printf("Desired Image Size (Height): ");
fflush(stdout);
scanf ("%d", &JPEGImageHeight);
printf("Desired Quality factor : ");
fflush(stdout);
scanf ("%d", &QualityFactor);
key = getchar(); // clear the final character (\n) in the input buffer
}
// delimit image sizes to valid values
// minimum image size must be 16 x 16 pixels
// maximum can be size of input resolution (720 x 486 for NTSC, 720 x 576 for PAL)
if (JPEGImageWidth < 0x10)
JPEGImageWidth = 0x10;
else if (JPEGImageWidth > ITU_PIXEL_PER_LINE)
JPEGImageWidth = ITU_PIXEL_PER_LINE;
if (JPEGImageHeight < 0x10)
JPEGImageHeight = 0x10;
else if (JPEGImageHeight > ActiveFrameLines)
JPEGImageHeight = ActiveFrameLines;
// Quality factor should be between 1 and 100
if (QualityFactor < 1)
QualityFactor = 1;
else if (QualityFactor > 100)
QualityFactor = 100;
// Sizes should be multiples of 16
JPEGImageWidth &= ~0xf;
JPEGImageHeight &= ~0xf;
// clear out video frame (black screen)
if (VideoMode == ITU656_PAL)
// Fill the Video out frame with background color
adi_video_FrameFill ((char *)pITU656Frames[0],PAL_IL,JPEGImageBackground);
else // VideoMode must be ITU656_NTSC
// Fill the Video out frame with background color
adi_video_FrameFill ((char *)pITU656Frames[0],NTSC_IL,JPEGImageBackground);
// Install video decoder (ADV7183)
InstallVideoDecoder();
// Setup MDMA for ITU656 to YUV conversion
SetupMDMA_YUV_ITU656();
#ifdef ADI_MMSK_EXTRA_INFO // Extra debug information
if (File_Settings == GET_FILE_SETTINGS_FROM_TXT_FILE)
{
// print actual parameters
printf("\nImage size to capture = %d x %d pixels\n", JPEGImageWidth, JPEGImageHeight);
printf("Encoding Quality Factor = %d \n", QualityFactor);
}
#endif
if (File_Settings == PROMPT_FOR_FILE_SETTINGS)
{
// build the next input file name in tempstring
strcpy (temp_path,current_path);
strcat(temp_path, current_input_file_name);
}
else if (File_Settings == GET_FILE_SETTINGS_FROM_TXT_FILE)
{
// build the next input file name in tempstring
strcpy(temp_path, ROOT_DIR);
strcat(strcat(temp_path, IMAGE_DIR_JPEG), current_input_file_name);
}
// encode the JPEG file
if ((return_code = JPEG_encode(temp_path)) != CODEC_SUCCESS)
{
if (return_code != CODEC_FILE_ERROR) // if it was a file error, try next file in the list
break; // error! Abort loop
}
// Wait for Key stroke to go to next file
printf("\nHit 'Return' key to go to next file or 'q' to quit: ");
fflush(stdout);
while (key = getchar())
{
if ( (key == 'q') || (key == 'Q') )
next_file = EOF;
else if (key == '\n')
break;
}
// check for end of file
if((next_file != EOF) && (next_file != (int)NULL))
{
if (File_Settings == PROMPT_FOR_FILE_SETTINGS)
{
printf("\nName this JPEG file as: ");
fflush(stdout);
scanf ("%s", current_input_file_name);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -