David Fletcher / Mbed 2 deprecated cc3100_Test_websock_Camera_CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Mon Jul 06 11:03:14 2015 +0000
Revision:
8:529a12812c53
Parent:
7:a069c1750fbc
Child:
9:b7c6e7303df5
WIP commit 9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 //*****************************************************************************
dflet 0:50cedd586816 2 // camera_app.c
dflet 0:50cedd586816 3 //
dflet 0:50cedd586816 4 // camera application macro & APIs
dflet 0:50cedd586816 5 //
dflet 0:50cedd586816 6 // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:50cedd586816 7 //
dflet 0:50cedd586816 8 //
dflet 0:50cedd586816 9 // Redistribution and use in source and binary forms, with or without
dflet 0:50cedd586816 10 // modification, are permitted provided that the following conditions
dflet 0:50cedd586816 11 // are met:
dflet 0:50cedd586816 12 //
dflet 0:50cedd586816 13 // Redistributions of source code must retain the above copyright
dflet 0:50cedd586816 14 // notice, this list of conditions and the following disclaimer.
dflet 0:50cedd586816 15 //
dflet 0:50cedd586816 16 // Redistributions in binary form must reproduce the above copyright
dflet 0:50cedd586816 17 // notice, this list of conditions and the following disclaimer in the
dflet 0:50cedd586816 18 // documentation and/or other materials provided with the
dflet 0:50cedd586816 19 // distribution.
dflet 0:50cedd586816 20 //
dflet 0:50cedd586816 21 // Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:50cedd586816 22 // its contributors may be used to endorse or promote products derived
dflet 0:50cedd586816 23 // from this software without specific prior written permission.
dflet 0:50cedd586816 24 //
dflet 0:50cedd586816 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:50cedd586816 26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:50cedd586816 27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:50cedd586816 28 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:50cedd586816 29 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:50cedd586816 30 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:50cedd586816 31 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:50cedd586816 32 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:50cedd586816 33 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:50cedd586816 34 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:50cedd586816 35 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:50cedd586816 36 //
dflet 0:50cedd586816 37 //*****************************************************************************
dflet 0:50cedd586816 38 //*****************************************************************************
dflet 0:50cedd586816 39 //
dflet 0:50cedd586816 40 //! \addtogroup camera_app
dflet 0:50cedd586816 41 //! @{
dflet 0:50cedd586816 42 //
dflet 0:50cedd586816 43 //*****************************************************************************
dflet 5:75fcfdb7cae7 44 #include "mbed.h"
dflet 0:50cedd586816 45 #include <stdio.h>
dflet 0:50cedd586816 46 #include <string.h>
dflet 0:50cedd586816 47 #include <stdlib.h>
dflet 0:50cedd586816 48
dflet 0:50cedd586816 49 // SimpleLink include
dflet 0:50cedd586816 50 #include "cc3100_simplelink.h"
dflet 0:50cedd586816 51
dflet 6:37fb696395d7 52 #include "oslib/osi.h"
dflet 0:50cedd586816 53 #include "camera_app.h"
dflet 0:50cedd586816 54 #include "mt9d111.h"
dflet 0:50cedd586816 55 #include "i2cconfig.h"
dflet 4:c27adffcfec2 56
dflet 0:50cedd586816 57 #include "cli_uart.h"
dflet 3:7643714ec664 58 #include "Led_config.h"
dflet 6:37fb696395d7 59 #include "HttpDebug.h"
dflet 0:50cedd586816 60
dflet 0:50cedd586816 61 using namespace mbed_cc3100;
dflet 0:50cedd586816 62
dflet 7:a069c1750fbc 63 #define ENABLE_JPEG
dflet 0:50cedd586816 64
dflet 0:50cedd586816 65 //*****************************************************************************
dflet 0:50cedd586816 66 // Macros
dflet 0:50cedd586816 67 //*****************************************************************************
dflet 0:50cedd586816 68 #define USER_FILE_NAME "www/images/cc3200_camera_capture.jpg"
dflet 0:50cedd586816 69 #define TOTAL_DMA_ELEMENTS 64
dflet 0:50cedd586816 70 #define AP_SSID_LEN_MAX (33)
dflet 0:50cedd586816 71 #define ROLE_INVALID (-5)
dflet 0:50cedd586816 72 //*****************************************************************************
dflet 0:50cedd586816 73 // GLOBAL VARIABLES
dflet 0:50cedd586816 74 //*****************************************************************************
dflet 5:75fcfdb7cae7 75
dflet 0:50cedd586816 76 unsigned int g_frame_size_in_bytes;
dflet 0:50cedd586816 77 unsigned int g_uiDeviceModeConfig = ROLE_AP; //default is AP mode
dflet 0:50cedd586816 78 extern volatile unsigned char g_CaptureImage;
dflet 0:50cedd586816 79 extern int g_uiIpObtained = 0;
dflet 0:50cedd586816 80 extern int g_uiSimplelinkRole = ROLE_INVALID;
dflet 0:50cedd586816 81 unsigned int g_uiIpAddress = 0;
dflet 0:50cedd586816 82 static unsigned int *p_buffer = NULL;
dflet 0:50cedd586816 83 static unsigned char g_dma_txn_done;
dflet 0:50cedd586816 84 volatile static unsigned char g_frame_end;
dflet 0:50cedd586816 85 static unsigned int g_total_dma_intrpts;
dflet 0:50cedd586816 86
dflet 0:50cedd586816 87 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 88 int PIXELS_IN_X_AXIS = 640;
dflet 0:50cedd586816 89 int PIXELS_IN_Y_AXIS = 480;
dflet 0:50cedd586816 90 int FRAME_SIZE_IN_BYTES = (640 * 480 * 2);
dflet 0:50cedd586816 91 #else
dflet 0:50cedd586816 92 int PIXELS_IN_X_AXIS = 240;
dflet 0:50cedd586816 93 int PIXELS_IN_Y_AXIS = 256;
dflet 6:37fb696395d7 94 int FRAME_SIZE_IN_BYTES = (240 * 256 * 2);
dflet 0:50cedd586816 95 #endif
dflet 0:50cedd586816 96
dflet 6:37fb696395d7 97 //#ifdef ENABLE_JPEG
dflet 0:50cedd586816 98 unsigned int g_header_length;
dflet 6:37fb696395d7 99 //#endif
dflet 0:50cedd586816 100
dflet 0:50cedd586816 101 struct ImageBuffer
dflet 0:50cedd586816 102 {
dflet 6:37fb696395d7 103 //#ifdef ENABLE_JPEG
dflet 0:50cedd586816 104 char g_header[SMTP_BUF_LEN] /*= {'\0'}*/;
dflet 6:37fb696395d7 105 //#endif
dflet 7:a069c1750fbc 106 uint32_t g_image_buffer[NUM_OF_4B_CHUNKS];//60Kb 15360, 50Kb 12800
dflet 0:50cedd586816 107 };
dflet 0:50cedd586816 108
dflet 0:50cedd586816 109 ImageBuffer g_image;
dflet 0:50cedd586816 110
dflet 0:50cedd586816 111 typedef enum pictureRequest{
dflet 0:50cedd586816 112 NO_PICTURE = 0x00,
dflet 0:50cedd586816 113 SINGLE_HIGH_RESOLUTION = 0x01,
dflet 0:50cedd586816 114 STREAM_LOW_RESOLUTION = 0x02
dflet 0:50cedd586816 115
dflet 0:50cedd586816 116 }e_pictureRequest;
dflet 0:50cedd586816 117
dflet 0:50cedd586816 118 typedef enum pictureFormat{
dflet 0:50cedd586816 119 RAW_10BIT = 0,
dflet 0:50cedd586816 120 ITU_R_BT601,
dflet 0:50cedd586816 121 YCbCr_4_2_2,
dflet 0:50cedd586816 122 YCbCr_4_2_0,
dflet 0:50cedd586816 123 RGB_565,
dflet 0:50cedd586816 124 RGB_555,
dflet 0:50cedd586816 125 RGB_444
dflet 0:50cedd586816 126
dflet 0:50cedd586816 127 }e_pictureFormat;
dflet 0:50cedd586816 128
dflet 0:50cedd586816 129 typedef enum pictureResolution{
dflet 0:50cedd586816 130 QVGA = 0,
dflet 0:50cedd586816 131 VGA,
dflet 0:50cedd586816 132 SVGA,
dflet 0:50cedd586816 133 XGA,
dflet 0:50cedd586816 134 uXGA
dflet 0:50cedd586816 135
dflet 0:50cedd586816 136 }e_pictureResolution;
dflet 0:50cedd586816 137
dflet 0:50cedd586816 138
dflet 0:50cedd586816 139 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 140 #define FORMAT_YCBCR422 0
dflet 0:50cedd586816 141 #define FORMAT_YCBCR420 1
dflet 0:50cedd586816 142 #define FORMAT_MONOCHROME 2
dflet 0:50cedd586816 143
dflet 0:50cedd586816 144 unsigned char JPEG_StdQuantTblY[64] =
dflet 0:50cedd586816 145 {
dflet 0:50cedd586816 146 16, 11, 10, 16, 24, 40, 51, 61,
dflet 0:50cedd586816 147 12, 12, 14, 19, 26, 58, 60, 55,
dflet 0:50cedd586816 148 14, 13, 16, 24, 40, 57, 69, 56,
dflet 0:50cedd586816 149 14, 17, 22, 29, 51, 87, 80, 62,
dflet 0:50cedd586816 150 18, 22, 37, 56, 68, 109, 103, 77,
dflet 0:50cedd586816 151 24, 35, 55, 64, 81, 104, 113, 92,
dflet 0:50cedd586816 152 49, 64, 78, 87, 103, 121, 120, 101,
dflet 0:50cedd586816 153 72, 92, 95, 98, 112, 100, 103, 99
dflet 0:50cedd586816 154 };
dflet 0:50cedd586816 155
dflet 0:50cedd586816 156 unsigned char JPEG_StdQuantTblC[64] =
dflet 0:50cedd586816 157 {
dflet 0:50cedd586816 158 17, 18, 24, 47, 99, 99, 99, 99,
dflet 0:50cedd586816 159 18, 21, 26, 66, 99, 99, 99, 99,
dflet 0:50cedd586816 160 24, 26, 56, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 161 47, 66, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 162 99, 99, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 163 99, 99, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 164 99, 99, 99, 99, 99, 99, 99, 99,
dflet 0:50cedd586816 165 99, 99, 99, 99, 99, 99, 99, 99
dflet 0:50cedd586816 166 };
dflet 0:50cedd586816 167 //
dflet 0:50cedd586816 168 // This table is used for regular-position to zigzagged-position lookup
dflet 0:50cedd586816 169 // This is Figure A.6 from the ISO/IEC 10918-1 1993 specification
dflet 0:50cedd586816 170 //
dflet 0:50cedd586816 171 static unsigned char zigzag[64] =
dflet 0:50cedd586816 172 {
dflet 0:50cedd586816 173 0, 1, 5, 6,14,15,27,28,
dflet 0:50cedd586816 174 2, 4, 7,13,16,26,29,42,
dflet 0:50cedd586816 175 3, 8,12,17,25,30,41,43,
dflet 0:50cedd586816 176 9,11,18,24,31,40,44,53,
dflet 0:50cedd586816 177 10,19,23,32,39,45,52,54,
dflet 0:50cedd586816 178 20,22,33,38,46,51,55,60,
dflet 0:50cedd586816 179 21,34,37,47,50,56,59,61,
dflet 0:50cedd586816 180 35,36,48,49,57,58,62,63
dflet 0:50cedd586816 181 };
dflet 0:50cedd586816 182
dflet 0:50cedd586816 183 unsigned int JPEG_StdHuffmanTbl[384] =
dflet 0:50cedd586816 184 {
dflet 0:50cedd586816 185 0x100, 0x101, 0x204, 0x30b, 0x41a, 0x678, 0x7f8, 0x9f6,
dflet 0:50cedd586816 186 0xf82, 0xf83, 0x30c, 0x41b, 0x679, 0x8f6, 0xaf6, 0xf84,
dflet 0:50cedd586816 187 0xf85, 0xf86, 0xf87, 0xf88, 0x41c, 0x7f9, 0x9f7, 0xbf4,
dflet 0:50cedd586816 188 0xf89, 0xf8a, 0xf8b, 0xf8c, 0xf8d, 0xf8e, 0x53a, 0x8f7,
dflet 0:50cedd586816 189 0xbf5, 0xf8f, 0xf90, 0xf91, 0xf92, 0xf93, 0xf94, 0xf95,
dflet 0:50cedd586816 190 0x53b, 0x9f8, 0xf96, 0xf97, 0xf98, 0xf99, 0xf9a, 0xf9b,
dflet 0:50cedd586816 191 0xf9c, 0xf9d, 0x67a, 0xaf7, 0xf9e, 0xf9f, 0xfa0, 0xfa1,
dflet 0:50cedd586816 192 0xfa2, 0xfa3, 0xfa4, 0xfa5, 0x67b, 0xbf6, 0xfa6, 0xfa7,
dflet 0:50cedd586816 193 0xfa8, 0xfa9, 0xfaa, 0xfab, 0xfac, 0xfad, 0x7fa, 0xbf7,
dflet 0:50cedd586816 194 0xfae, 0xfaf, 0xfb0, 0xfb1, 0xfb2, 0xfb3, 0xfb4, 0xfb5,
dflet 0:50cedd586816 195 0x8f8, 0xec0, 0xfb6, 0xfb7, 0xfb8, 0xfb9, 0xfba, 0xfbb,
dflet 0:50cedd586816 196 0xfbc, 0xfbd, 0x8f9, 0xfbe, 0xfbf, 0xfc0, 0xfc1, 0xfc2,
dflet 0:50cedd586816 197 0xfc3, 0xfc4, 0xfc5, 0xfc6, 0x8fa, 0xfc7, 0xfc8, 0xfc9,
dflet 0:50cedd586816 198 0xfca, 0xfcb, 0xfcc, 0xfcd, 0xfce, 0xfcf, 0x9f9, 0xfd0,
dflet 0:50cedd586816 199 0xfd1, 0xfd2, 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7, 0xfd8,
dflet 0:50cedd586816 200 0x9fa, 0xfd9, 0xfda, 0xfdb, 0xfdc, 0xfdd, 0xfde, 0xfdf,
dflet 0:50cedd586816 201 0xfe0, 0xfe1, 0xaf8, 0xfe2, 0xfe3, 0xfe4, 0xfe5, 0xfe6,
dflet 0:50cedd586816 202 0xfe7, 0xfe8, 0xfe9, 0xfea, 0xfeb, 0xfec, 0xfed, 0xfee,
dflet 0:50cedd586816 203 0xfef, 0xff0, 0xff1, 0xff2, 0xff3, 0xff4, 0xff5, 0xff6,
dflet 0:50cedd586816 204 0xff7, 0xff8, 0xff9, 0xffa, 0xffb, 0xffc, 0xffd, 0xffe,
dflet 0:50cedd586816 205 0x30a, 0xaf9, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
dflet 0:50cedd586816 206 0xfd0, 0xfd1, 0xfd2, 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7,
dflet 0:50cedd586816 207 0x101, 0x204, 0x30a, 0x418, 0x419, 0x538, 0x678, 0x8f4,
dflet 0:50cedd586816 208 0x9f6, 0xbf4, 0x30b, 0x539, 0x7f6, 0x8f5, 0xaf6, 0xbf5,
dflet 0:50cedd586816 209 0xf88, 0xf89, 0xf8a, 0xf8b, 0x41a, 0x7f7, 0x9f7, 0xbf6,
dflet 0:50cedd586816 210 0xec2, 0xf8c, 0xf8d, 0xf8e, 0xf8f, 0xf90, 0x41b, 0x7f8,
dflet 0:50cedd586816 211 0x9f8, 0xbf7, 0xf91, 0xf92, 0xf93, 0xf94, 0xf95, 0xf96,
dflet 0:50cedd586816 212 0x53a, 0x8f6, 0xf97, 0xf98, 0xf99, 0xf9a, 0xf9b, 0xf9c,
dflet 0:50cedd586816 213 0xf9d, 0xf9e, 0x53b, 0x9f9, 0xf9f, 0xfa0, 0xfa1, 0xfa2,
dflet 0:50cedd586816 214 0xfa3, 0xfa4, 0xfa5, 0xfa6, 0x679, 0xaf7, 0xfa7, 0xfa8,
dflet 0:50cedd586816 215 0xfa9, 0xfaa, 0xfab, 0xfac, 0xfad, 0xfae, 0x67a, 0xaf8,
dflet 0:50cedd586816 216 0xfaf, 0xfb0, 0xfb1, 0xfb2, 0xfb3, 0xfb4, 0xfb5, 0xfb6,
dflet 0:50cedd586816 217 0x7f9, 0xfb7, 0xfb8, 0xfb9, 0xfba, 0xfbb, 0xfbc, 0xfbd,
dflet 0:50cedd586816 218 0xfbe, 0xfbf, 0x8f7, 0xfc0, 0xfc1, 0xfc2, 0xfc3, 0xfc4,
dflet 0:50cedd586816 219 0xfc5, 0xfc6, 0xfc7, 0xfc8, 0x8f8, 0xfc9, 0xfca, 0xfcb,
dflet 0:50cedd586816 220 0xfcc, 0xfcd, 0xfce, 0xfcf, 0xfd0, 0xfd1, 0x8f9, 0xfd2,
dflet 0:50cedd586816 221 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7, 0xfd8, 0xfd9, 0xfda,
dflet 0:50cedd586816 222 0x8fa, 0xfdb, 0xfdc, 0xfdd, 0xfde, 0xfdf, 0xfe0, 0xfe1,
dflet 0:50cedd586816 223 0xfe2, 0xfe3, 0xaf9, 0xfe4, 0xfe5, 0xfe6, 0xfe7, 0xfe8,
dflet 0:50cedd586816 224 0xfe9, 0xfea, 0xfeb, 0xfec, 0xde0, 0xfed, 0xfee, 0xfef,
dflet 0:50cedd586816 225 0xff0, 0xff1, 0xff2, 0xff3, 0xff4, 0xff5, 0xec3, 0xff6,
dflet 0:50cedd586816 226 0xff7, 0xff8, 0xff9, 0xffa, 0xffb, 0xffc, 0xffd, 0xffe,
dflet 0:50cedd586816 227 0x100, 0x9fa, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
dflet 0:50cedd586816 228 0xfd0, 0xfd1, 0xfd2, 0xfd3, 0xfd4, 0xfd5, 0xfd6, 0xfd7,
dflet 0:50cedd586816 229 0x100, 0x202, 0x203, 0x204, 0x205, 0x206, 0x30e, 0x41e,
dflet 0:50cedd586816 230 0x53e, 0x67e, 0x7fe, 0x8fe, 0xfff, 0xfff, 0xfff, 0xfff,
dflet 0:50cedd586816 231 0x100, 0x101, 0x102, 0x206, 0x30e, 0x41e, 0x53e, 0x67e,
dflet 0:50cedd586816 232 0x7fe, 0x8fe, 0x9fe, 0xafe, 0xfff, 0xfff, 0xfff, 0xfff
dflet 0:50cedd586816 233 };
dflet 0:50cedd586816 234 #endif
dflet 0:50cedd586816 235
dflet 0:50cedd586816 236 //*****************************************************************************
dflet 0:50cedd586816 237 //
dflet 0:50cedd586816 238 //! Start Camera
dflet 0:50cedd586816 239 //! 1. Establishes connection w/ AP//
dflet 0:50cedd586816 240 //! 2. Initializes the camera sub-components//! GPIO Enable & Configuration
dflet 0:50cedd586816 241 //! 3. Listens and processes the image capture requests from user-applications
dflet 0:50cedd586816 242 //!
dflet 0:50cedd586816 243 //! \param[out] WriteBuffer - Pointer to the Frame Buffer
dflet 0:50cedd586816 244 //! \return None
dflet 0:50cedd586816 245 //
dflet 0:50cedd586816 246 //*****************************************************************************
dflet 0:50cedd586816 247
dflet 0:50cedd586816 248 unsigned short StartCamera(char **WriteBuffer)
dflet 0:50cedd586816 249 {
dflet 6:37fb696395d7 250 // Uart_Write((uint8_t*)"StartCamera \n\r");
dflet 0:50cedd586816 251 unsigned short Writelength;
dflet 0:50cedd586816 252 //
dflet 0:50cedd586816 253 // Waits in the below loop till Capture button is pressed
dflet 0:50cedd586816 254 //
dflet 0:50cedd586816 255 Writelength = CaptureImage(WriteBuffer);
dflet 0:50cedd586816 256
dflet 0:50cedd586816 257 return(Writelength);
dflet 0:50cedd586816 258
dflet 0:50cedd586816 259 }
dflet 0:50cedd586816 260 //*****************************************************************************
dflet 0:50cedd586816 261 //
dflet 0:50cedd586816 262 //! InitCameraComponents
dflet 0:50cedd586816 263 //! PinMux, Camera Initialization and Configuration
dflet 0:50cedd586816 264 //!
dflet 0:50cedd586816 265 //! \param[in] width - X-Axis
dflet 0:50cedd586816 266 //! \param[in] width - Y-Axis
dflet 0:50cedd586816 267 //! \return None
dflet 0:50cedd586816 268 //
dflet 0:50cedd586816 269 //*****************************************************************************
dflet 0:50cedd586816 270
dflet 0:50cedd586816 271 void InitCameraComponents(int width, int height)
dflet 0:50cedd586816 272 {
dflet 6:37fb696395d7 273 // Uart_Write((uint8_t*)"InitCameraComponents \n\r");
dflet 0:50cedd586816 274 //
dflet 0:50cedd586816 275 // Initialize I2C Interface
dflet 0:50cedd586816 276 //
dflet 0:50cedd586816 277 I2CInit();
dflet 6:37fb696395d7 278
dflet 0:50cedd586816 279 //
dflet 0:50cedd586816 280 // Initialize camera sensor
dflet 0:50cedd586816 281 //
dflet 0:50cedd586816 282 CameraSensorInit();
dflet 0:50cedd586816 283
dflet 0:50cedd586816 284 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 285 //
dflet 0:50cedd586816 286 // Configure Sensor in Capture Mode
dflet 0:50cedd586816 287 //
dflet 0:50cedd586816 288 PIXELS_IN_X_AXIS = width;
dflet 0:50cedd586816 289 PIXELS_IN_Y_AXIS = height;
dflet 0:50cedd586816 290 FRAME_SIZE_IN_BYTES = PIXELS_IN_X_AXIS * PIXELS_IN_Y_AXIS * BYTES_PER_PIXEL;
dflet 0:50cedd586816 291
dflet 0:50cedd586816 292 StartSensorInJpegMode(width, height);
dflet 0:50cedd586816 293
dflet 0:50cedd586816 294 #endif
dflet 0:50cedd586816 295 }
dflet 0:50cedd586816 296
dflet 0:50cedd586816 297 //*****************************************************************************
dflet 0:50cedd586816 298 //
dflet 0:50cedd586816 299 //! Set resolution of camera
dflet 0:50cedd586816 300 //!
dflet 0:50cedd586816 301 //! \param[in] width - X Axis
dflet 0:50cedd586816 302 //! \param[in] height - Y Axis
dflet 0:50cedd586816 303 //! \return 0 on success else -ve
dflet 0:50cedd586816 304 //
dflet 0:50cedd586816 305 //*****************************************************************************
dflet 0:50cedd586816 306
dflet 0:50cedd586816 307 int SetCameraResolution(int width, int height)
dflet 0:50cedd586816 308 {
dflet 0:50cedd586816 309 Uart_Write((uint8_t*)"SetCameraResolution \n\r");
dflet 0:50cedd586816 310 int lRetVal = 0;
dflet 0:50cedd586816 311
dflet 0:50cedd586816 312 PIXELS_IN_X_AXIS = width;
dflet 0:50cedd586816 313 PIXELS_IN_Y_AXIS = height;
dflet 0:50cedd586816 314 FRAME_SIZE_IN_BYTES = PIXELS_IN_X_AXIS * PIXELS_IN_Y_AXIS * BYTES_PER_PIXEL;
dflet 0:50cedd586816 315 lRetVal = CameraSensorResolution(width, height);
dflet 0:50cedd586816 316 return lRetVal;
dflet 0:50cedd586816 317 }
dflet 0:50cedd586816 318
dflet 0:50cedd586816 319 //*****************************************************************************
dflet 0:50cedd586816 320 //
dflet 0:50cedd586816 321 //! CaptureImage
dflet 0:50cedd586816 322 //! Configures DMA and starts the Capture. Post Capture writes to SFLASH
dflet 0:50cedd586816 323 //!
dflet 0:50cedd586816 324 //! \param None
dflet 0:50cedd586816 325 //! \return None
dflet 0:50cedd586816 326 //!
dflet 0:50cedd586816 327 //
dflet 0:50cedd586816 328 //*****************************************************************************
dflet 5:75fcfdb7cae7 329 DCMI_HandleTypeDef phdcmi;
dflet 5:75fcfdb7cae7 330 DMA_HandleTypeDef hdma_dcmi;
dflet 0:50cedd586816 331 static unsigned short CaptureImage(char** WriteBuffer)
dflet 0:50cedd586816 332 {
dflet 6:37fb696395d7 333 // Uart_Write((uint8_t*)"CaptureImage \n\r");
dflet 7:a069c1750fbc 334 // memset(g_image.g_image_buffer,0xF80F,sizeof(g_image.g_image_buffer));
dflet 7:a069c1750fbc 335 memset(g_image.g_image_buffer,0x0F,sizeof(g_image.g_image_buffer));
dflet 2:b92db44a29b4 336 p_buffer = &(g_image.g_image_buffer[0]);
dflet 0:50cedd586816 337 DMAConfig();
dflet 0:50cedd586816 338
dflet 0:50cedd586816 339 //
dflet 0:50cedd586816 340 // Perform Image Capture
dflet 0:50cedd586816 341 //
dflet 8:529a12812c53 342
dflet 8:529a12812c53 343 HAL_DCMI_Start_DMA(&phdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)p_buffer, FRAME_SIZE_IN_BYTES/4);
dflet 2:b92db44a29b4 344 g_frame_end = 1;
dflet 2:b92db44a29b4 345
dflet 2:b92db44a29b4 346 /* Read the number of data items transferred */
dflet 7:a069c1750fbc 347 g_frame_size_in_bytes = (FRAME_SIZE_IN_BYTES - (hdma_dcmi.Instance->NDTR*4));
dflet 5:75fcfdb7cae7 348 g_dma_txn_done = 1;
dflet 5:75fcfdb7cae7 349 g_total_dma_intrpts = 1;
dflet 5:75fcfdb7cae7 350
dflet 8:529a12812c53 351 uint8_t* Image_Array = reinterpret_cast<uint8_t*>(&g_image.g_image_buffer);
dflet 8:529a12812c53 352 #if 0
dflet 8:529a12812c53 353 for(int i =0;i< 100;i++){
dflet 8:529a12812c53 354 HttpDebug("0x%x ",Image_Array[i]);
dflet 8:529a12812c53 355 }
dflet 8:529a12812c53 356 #endif//if 0
dflet 0:50cedd586816 357 //
dflet 0:50cedd586816 358 // Create JPEG Header
dflet 0:50cedd586816 359 //
dflet 0:50cedd586816 360 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 361 memset(g_image.g_header, '\0', sizeof(g_image.g_header));
dflet 0:50cedd586816 362 g_header_length = CreateJpegHeader((char *)&(g_image.g_header[0]), PIXELS_IN_X_AXIS,
dflet 0:50cedd586816 363 PIXELS_IN_Y_AXIS, 0, 0x0020, 9);
dflet 0:50cedd586816 364
dflet 8:529a12812c53 365 // This pushes the header to the start of the array so that the entire picture can be contiguous in memory
dflet 8:529a12812c53 366 memcpy(Image_Array + g_header_length,Image_Array,g_frame_size_in_bytes);
dflet 8:529a12812c53 367 memcpy(Image_Array,g_image.g_header,g_header_length);
dflet 8:529a12812c53 368 #if 0
dflet 8:529a12812c53 369 for(int i =625;i< 725;i++){
dflet 8:529a12812c53 370 HttpDebug("0x%x ",Image_Array[i]);
dflet 8:529a12812c53 371 }
dflet 8:529a12812c53 372 #endif//if 0
dflet 0:50cedd586816 373
dflet 8:529a12812c53 374 #endif//ENABLE_JPEG
dflet 8:529a12812c53 375
dflet 8:529a12812c53 376 *WriteBuffer = (char*)Image_Array;
dflet 8:529a12812c53 377
dflet 0:50cedd586816 378 return(g_header_length + g_frame_size_in_bytes);
dflet 0:50cedd586816 379 }
dflet 0:50cedd586816 380 //*****************************************************************************
dflet 0:50cedd586816 381 //
dflet 0:50cedd586816 382 //! DMA Config
dflet 6:37fb696395d7 383 //! Initialize the DMA\DCMI and Setup the DMA transfer
dflet 0:50cedd586816 384 //!
dflet 0:50cedd586816 385 //! \param None
dflet 0:50cedd586816 386 //! \return None
dflet 0:50cedd586816 387 //
dflet 0:50cedd586816 388 //*****************************************************************************
dflet 0:50cedd586816 389 static void DMAConfig()
dflet 0:50cedd586816 390 {
dflet 6:37fb696395d7 391 // Uart_Write((uint8_t*)"DMAConfig \n\r");
dflet 5:75fcfdb7cae7 392
dflet 5:75fcfdb7cae7 393 /* Peripheral DMA init*/
dflet 5:75fcfdb7cae7 394 /* DMA controller clock enable */
dflet 5:75fcfdb7cae7 395 __DMA2_CLK_ENABLE();
dflet 5:75fcfdb7cae7 396
dflet 5:75fcfdb7cae7 397 hdma_dcmi.Instance = DMA2_Stream1;
dflet 5:75fcfdb7cae7 398 hdma_dcmi.Init.Channel = DMA_CHANNEL_1;
dflet 5:75fcfdb7cae7 399 hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;
dflet 5:75fcfdb7cae7 400 hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;
dflet 5:75fcfdb7cae7 401 hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE;
dflet 5:75fcfdb7cae7 402 hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
dflet 5:75fcfdb7cae7 403 hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
dflet 7:a069c1750fbc 404 hdma_dcmi.Init.Mode = DMA_CIRCULAR;
dflet 5:75fcfdb7cae7 405 hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH;
dflet 7:a069c1750fbc 406 hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
dflet 5:75fcfdb7cae7 407 hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
dflet 5:75fcfdb7cae7 408 hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE;
dflet 5:75fcfdb7cae7 409 hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
dflet 5:75fcfdb7cae7 410
dflet 5:75fcfdb7cae7 411 __HAL_LINKDMA(&phdcmi,DMA_Handle,hdma_dcmi);
dflet 5:75fcfdb7cae7 412
dflet 5:75fcfdb7cae7 413 /* DMA interrupt init */
dflet 7:a069c1750fbc 414 HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 1, 0);
dflet 5:75fcfdb7cae7 415 HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
dflet 5:75fcfdb7cae7 416
dflet 5:75fcfdb7cae7 417 phdcmi.Instance = DCMI;
dflet 5:75fcfdb7cae7 418 phdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
dflet 7:a069c1750fbc 419 phdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
dflet 5:75fcfdb7cae7 420 phdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
dflet 5:75fcfdb7cae7 421 phdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
dflet 5:75fcfdb7cae7 422 phdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
dflet 5:75fcfdb7cae7 423 phdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
dflet 5:75fcfdb7cae7 424 #ifdef ENABLE_JPEG
dflet 5:75fcfdb7cae7 425 phdcmi.Init.JPEGMode = DCMI_JPEG_ENABLE;
dflet 5:75fcfdb7cae7 426 #else
dflet 5:75fcfdb7cae7 427 phdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
dflet 5:75fcfdb7cae7 428 #endif
dflet 5:75fcfdb7cae7 429
dflet 5:75fcfdb7cae7 430 GPIO_InitTypeDef GPIO_InitStruct;
dflet 5:75fcfdb7cae7 431 if(phdcmi.Instance==DCMI)
dflet 5:75fcfdb7cae7 432 {
dflet 5:75fcfdb7cae7 433 __GPIOE_CLK_ENABLE();
dflet 5:75fcfdb7cae7 434 __GPIOA_CLK_ENABLE();
dflet 5:75fcfdb7cae7 435 __GPIOB_CLK_ENABLE();
dflet 7:a069c1750fbc 436 __GPIOC_CLK_ENABLE();
dflet 5:75fcfdb7cae7 437
dflet 5:75fcfdb7cae7 438 /**MCO2 GPIO Configuration
dflet 7:a069c1750fbc 439 PC9 ------> RCC_MCO_2
dflet 7:a069c1750fbc 440 PA8 ------> RCC_MCO_1
dflet 5:75fcfdb7cae7 441 */
dflet 5:75fcfdb7cae7 442
dflet 5:75fcfdb7cae7 443 /* Peripheral clock enable */
dflet 5:75fcfdb7cae7 444 __DCMI_CLK_ENABLE();
dflet 5:75fcfdb7cae7 445
dflet 7:a069c1750fbc 446 /**DCMI GPIO Configuration
dflet 7:a069c1750fbc 447 PA9 ------> DCMI_D0
dflet 7:a069c1750fbc 448 PA10 ------> DCMI_D1
dflet 7:a069c1750fbc 449 PC8 ------> DCMI_D2
dflet 7:a069c1750fbc 450 PE1 ------> DCMI_D3
dflet 5:75fcfdb7cae7 451 PE4 ------> DCMI_D4
dflet 7:a069c1750fbc 452 PB6 ------> DCMI_D5
dflet 5:75fcfdb7cae7 453 PE5 ------> DCMI_D6
dflet 5:75fcfdb7cae7 454 PE6 ------> DCMI_D7
dflet 7:a069c1750fbc 455 PA6 ------> DCMI_PIXCK
dflet 5:75fcfdb7cae7 456 PA4 ------> DCMI_HSYNC
dflet 7:a069c1750fbc 457 PB7 ------> DCMI_VSYNC
dflet 7:a069c1750fbc 458 PC9 ------> MCLK
dflet 5:75fcfdb7cae7 459 */
dflet 7:a069c1750fbc 460 /* D3 D4 D6 D7 */
dflet 5:75fcfdb7cae7 461 GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
dflet 5:75fcfdb7cae7 462 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 7:a069c1750fbc 463 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 5:75fcfdb7cae7 464 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 5:75fcfdb7cae7 465 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 5:75fcfdb7cae7 466 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
dflet 7:a069c1750fbc 467
dflet 7:a069c1750fbc 468 /* HSYNC PIXCLK D0 D1 */
dflet 5:75fcfdb7cae7 469 GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_9|GPIO_PIN_10;
dflet 5:75fcfdb7cae7 470 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 7:a069c1750fbc 471 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 5:75fcfdb7cae7 472 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 5:75fcfdb7cae7 473 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 5:75fcfdb7cae7 474 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
dflet 7:a069c1750fbc 475
dflet 7:a069c1750fbc 476 /* D2 */
dflet 5:75fcfdb7cae7 477 GPIO_InitStruct.Pin = GPIO_PIN_8;
dflet 5:75fcfdb7cae7 478 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 7:a069c1750fbc 479 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 5:75fcfdb7cae7 480 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 5:75fcfdb7cae7 481 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 5:75fcfdb7cae7 482 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
dflet 5:75fcfdb7cae7 483
dflet 5:75fcfdb7cae7 484 /*Configure GPIO pin : GPIO_AF0_MCO PC9 */
dflet 5:75fcfdb7cae7 485 GPIO_InitStruct.Pin = GPIO_PIN_9;
dflet 5:75fcfdb7cae7 486 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 7:a069c1750fbc 487 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 5:75fcfdb7cae7 488 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 5:75fcfdb7cae7 489 GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
dflet 5:75fcfdb7cae7 490 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
dflet 7:a069c1750fbc 491
dflet 7:a069c1750fbc 492 /*Configure GPIO pin : PA8 */
dflet 7:a069c1750fbc 493 GPIO_InitStruct.Pin = GPIO_PIN_8;
dflet 7:a069c1750fbc 494 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 7:a069c1750fbc 495 GPIO_InitStruct.Pull = GPIO_NOPULL;
dflet 7:a069c1750fbc 496 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
dflet 7:a069c1750fbc 497 GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
dflet 7:a069c1750fbc 498 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
dflet 7:a069c1750fbc 499
dflet 7:a069c1750fbc 500 /* D5 VSYNC */
dflet 5:75fcfdb7cae7 501 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
dflet 5:75fcfdb7cae7 502 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
dflet 7:a069c1750fbc 503 GPIO_InitStruct.Pull = GPIO_PULLUP;
dflet 5:75fcfdb7cae7 504 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
dflet 5:75fcfdb7cae7 505 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
dflet 5:75fcfdb7cae7 506 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
dflet 5:75fcfdb7cae7 507
dflet 5:75fcfdb7cae7 508 /* System interrupt init*/
dflet 7:a069c1750fbc 509 HAL_NVIC_SetPriority(DCMI_IRQn, 1, 0);
dflet 5:75fcfdb7cae7 510 HAL_NVIC_EnableIRQ(DCMI_IRQn);
dflet 5:75fcfdb7cae7 511
dflet 5:75fcfdb7cae7 512 HAL_DMA_Init(&hdma_dcmi);
dflet 5:75fcfdb7cae7 513 HAL_DCMI_Init(&phdcmi);
dflet 5:75fcfdb7cae7 514
dflet 5:75fcfdb7cae7 515 }
dflet 0:50cedd586816 516
dflet 0:50cedd586816 517 g_dma_txn_done = 0;
dflet 0:50cedd586816 518 g_frame_size_in_bytes = 0;
dflet 0:50cedd586816 519 g_frame_end = 0;
dflet 0:50cedd586816 520 g_total_dma_intrpts = 0;
dflet 6:37fb696395d7 521 }
dflet 0:50cedd586816 522
dflet 5:75fcfdb7cae7 523 void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* phdcmi){
dflet 5:75fcfdb7cae7 524
dflet 5:75fcfdb7cae7 525 if(phdcmi->Instance==DCMI)
dflet 5:75fcfdb7cae7 526 {
dflet 0:50cedd586816 527
dflet 5:75fcfdb7cae7 528 /* Peripheral clock disable */
dflet 5:75fcfdb7cae7 529 __DCMI_CLK_DISABLE();
dflet 5:75fcfdb7cae7 530
dflet 5:75fcfdb7cae7 531 /**DCMI GPIO Configuration
dflet 5:75fcfdb7cae7 532 PE4 ------> DCMI_D4
dflet 5:75fcfdb7cae7 533 PE5 ------> DCMI_D6
dflet 5:75fcfdb7cae7 534 PE6 ------> DCMI_D7
dflet 5:75fcfdb7cae7 535 PA4 ------> DCMI_HSYNC
dflet 5:75fcfdb7cae7 536 PA6 ------> DCMI_PIXCK
dflet 5:75fcfdb7cae7 537 PC8 ------> DCMI_D2
dflet 5:75fcfdb7cae7 538 PE1 ------> DCMI_D3
dflet 5:75fcfdb7cae7 539 PA9 ------> DCMI_D0
dflet 5:75fcfdb7cae7 540 PA10 ------> DCMI_D1
dflet 5:75fcfdb7cae7 541 PB6 ------> DCMI_D5
dflet 5:75fcfdb7cae7 542 PB7 ------> DCMI_VSYNC
dflet 5:75fcfdb7cae7 543
dflet 5:75fcfdb7cae7 544 PE1 ------> MCO2
dflet 5:75fcfdb7cae7 545 */
dflet 5:75fcfdb7cae7 546
dflet 5:75fcfdb7cae7 547 HAL_GPIO_DeInit(GPIOE, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
dflet 5:75fcfdb7cae7 548
dflet 5:75fcfdb7cae7 549 HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_9|GPIO_PIN_10);
dflet 5:75fcfdb7cae7 550
dflet 5:75fcfdb7cae7 551 HAL_GPIO_DeInit(GPIOC, GPIO_PIN_9|GPIO_PIN_8);
dflet 5:75fcfdb7cae7 552
dflet 5:75fcfdb7cae7 553 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
dflet 5:75fcfdb7cae7 554
dflet 5:75fcfdb7cae7 555 /* Peripheral DMA DeInit*/
dflet 5:75fcfdb7cae7 556 HAL_DMA_DeInit(phdcmi->DMA_Handle);
dflet 5:75fcfdb7cae7 557
dflet 5:75fcfdb7cae7 558 /* Peripheral interrupt DeInit*/
dflet 5:75fcfdb7cae7 559 HAL_NVIC_DisableIRQ(DCMI_IRQn);
dflet 5:75fcfdb7cae7 560
dflet 5:75fcfdb7cae7 561 }
dflet 5:75fcfdb7cae7 562
dflet 5:75fcfdb7cae7 563 }
dflet 0:50cedd586816 564
dflet 0:50cedd586816 565 //*****************************************************************************
dflet 0:50cedd586816 566 //
dflet 0:50cedd586816 567 //! JfifApp0Marker
dflet 0:50cedd586816 568 //!
dflet 0:50cedd586816 569 //! \param Pointer to the output buffer
dflet 0:50cedd586816 570 //! \return Length of the Marker
dflet 0:50cedd586816 571 //
dflet 0:50cedd586816 572 //*****************************************************************************
dflet 0:50cedd586816 573
dflet 0:50cedd586816 574 #ifdef ENABLE_JPEG
dflet 0:50cedd586816 575 static int JfifApp0Marker(char *pbuf)
dflet 0:50cedd586816 576 {
dflet 7:a069c1750fbc 577 // Uart_Write((uint8_t*)"JfifApp0Marker \n\r");
dflet 0:50cedd586816 578 *pbuf++= 0xFF; // APP0 marker
dflet 0:50cedd586816 579 *pbuf++= 0xE0;
dflet 0:50cedd586816 580 *pbuf++= 0x00; // length
dflet 0:50cedd586816 581 *pbuf++= 0x10;
dflet 0:50cedd586816 582 *pbuf++= 0x4A; // JFIF identifier
dflet 0:50cedd586816 583 *pbuf++= 0x46;
dflet 0:50cedd586816 584 *pbuf++= 0x49;
dflet 0:50cedd586816 585 *pbuf++= 0x46;
dflet 0:50cedd586816 586 *pbuf++= 0x00;
dflet 0:50cedd586816 587 *pbuf++= 0x01; // version
dflet 0:50cedd586816 588 *pbuf++= 0x02;
dflet 0:50cedd586816 589 *pbuf++= 0x00; // units
dflet 0:50cedd586816 590 *pbuf++= 0x00; // X density
dflet 0:50cedd586816 591 *pbuf++= 0x01;
dflet 0:50cedd586816 592 *pbuf++= 0x00; // Y density
dflet 0:50cedd586816 593 *pbuf++= 0x01;
dflet 0:50cedd586816 594 *pbuf++= 0x00; // X thumbnail
dflet 0:50cedd586816 595 *pbuf++= 0x00; // Y thumbnail
dflet 0:50cedd586816 596 return 18;
dflet 0:50cedd586816 597 }
dflet 0:50cedd586816 598
dflet 0:50cedd586816 599
dflet 0:50cedd586816 600 //*****************************************************************************
dflet 0:50cedd586816 601 //
dflet 0:50cedd586816 602 //! FrameHeaderMarker
dflet 0:50cedd586816 603 //!
dflet 0:50cedd586816 604 //! \param1 pointer to the output buffer
dflet 0:50cedd586816 605 //! \param2 width
dflet 0:50cedd586816 606 //! \param3 height
dflet 0:50cedd586816 607 //! \param4 format
dflet 0:50cedd586816 608 //!
dflet 0:50cedd586816 609 //! \return Length of the header marker
dflet 0:50cedd586816 610 //
dflet 0:50cedd586816 611 //*****************************************************************************
dflet 0:50cedd586816 612 static int FrameHeaderMarker(char *pbuf, int width, int height, int format)
dflet 0:50cedd586816 613 {
dflet 7:a069c1750fbc 614 // Uart_Write((uint8_t*)"FrameHeaderMarker \n\r");
dflet 0:50cedd586816 615 int length;
dflet 0:50cedd586816 616 if (format == FORMAT_MONOCHROME)
dflet 0:50cedd586816 617 length = 11;
dflet 0:50cedd586816 618 else
dflet 0:50cedd586816 619 length = 17;
dflet 0:50cedd586816 620
dflet 0:50cedd586816 621 *pbuf++= 0xFF; // start of frame: baseline DCT
dflet 0:50cedd586816 622 *pbuf++= 0xC0;
dflet 0:50cedd586816 623 *pbuf++= length>>8; // length field
dflet 0:50cedd586816 624 *pbuf++= length&0xFF;
dflet 0:50cedd586816 625 *pbuf++= 0x08; // sample precision
dflet 0:50cedd586816 626 *pbuf++= height>>8; // number of lines
dflet 0:50cedd586816 627 *pbuf++= height&0xFF;
dflet 0:50cedd586816 628 *pbuf++= width>>8; // number of samples per line
dflet 0:50cedd586816 629 *pbuf++= width&0xFF;
dflet 0:50cedd586816 630
dflet 0:50cedd586816 631 if (format == FORMAT_MONOCHROME) // monochrome
dflet 0:50cedd586816 632 {
dflet 0:50cedd586816 633 *pbuf++= 0x01; // number of image components in frame
dflet 0:50cedd586816 634 *pbuf++= 0x00; // component identifier: Y
dflet 0:50cedd586816 635 *pbuf++= 0x11; // horizontal | vertical sampling factor: Y
dflet 0:50cedd586816 636 *pbuf++= 0x00; // quantization table selector: Y
dflet 0:50cedd586816 637 }
dflet 0:50cedd586816 638 else if (format == FORMAT_YCBCR422) // YCbCr422
dflet 0:50cedd586816 639 {
dflet 0:50cedd586816 640 *pbuf++= 0x03; // number of image components in frame
dflet 0:50cedd586816 641 *pbuf++= 0x00; // component identifier: Y
dflet 0:50cedd586816 642 *pbuf++= 0x21; // horizontal | vertical sampling factor: Y
dflet 0:50cedd586816 643 *pbuf++= 0x00; // quantization table selector: Y
dflet 0:50cedd586816 644 *pbuf++= 0x01; // component identifier: Cb
dflet 0:50cedd586816 645 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cb
dflet 0:50cedd586816 646 *pbuf++= 0x01; // quantization table selector: Cb
dflet 0:50cedd586816 647 *pbuf++= 0x02; // component identifier: Cr
dflet 0:50cedd586816 648 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cr
dflet 0:50cedd586816 649 *pbuf++= 0x01; // quantization table selector: Cr
dflet 0:50cedd586816 650 }
dflet 0:50cedd586816 651 else // YCbCr420
dflet 0:50cedd586816 652 {
dflet 0:50cedd586816 653 *pbuf++= 0x03; // number of image components in frame
dflet 0:50cedd586816 654 *pbuf++= 0x00; // component identifier: Y
dflet 0:50cedd586816 655 *pbuf++= 0x22; // horizontal | vertical sampling factor: Y
dflet 0:50cedd586816 656 *pbuf++= 0x00; // quantization table selector: Y
dflet 0:50cedd586816 657 *pbuf++= 0x01; // component identifier: Cb
dflet 0:50cedd586816 658 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cb
dflet 0:50cedd586816 659 *pbuf++= 0x01; // quantization table selector: Cb
dflet 0:50cedd586816 660 *pbuf++= 0x02; // component identifier: Cr
dflet 0:50cedd586816 661 *pbuf++= 0x11; // horizontal | vertical sampling factor: Cr
dflet 0:50cedd586816 662 *pbuf++= 0x01; // quantization table selector: Cr
dflet 0:50cedd586816 663 }
dflet 0:50cedd586816 664
dflet 0:50cedd586816 665 return (length+2);
dflet 0:50cedd586816 666 }
dflet 0:50cedd586816 667
dflet 0:50cedd586816 668
dflet 0:50cedd586816 669 //*****************************************************************************
dflet 0:50cedd586816 670 //
dflet 0:50cedd586816 671 //! ScanHeaderMarker
dflet 0:50cedd586816 672 //!
dflet 0:50cedd586816 673 //! \param1 pointer to output buffer
dflet 0:50cedd586816 674 //! \param2 Format
dflet 0:50cedd586816 675 //!
dflet 0:50cedd586816 676 //! \return Length
dflet 0:50cedd586816 677 //
dflet 0:50cedd586816 678 //*****************************************************************************
dflet 0:50cedd586816 679 static int ScanHeaderMarker(char *pbuf, int format)
dflet 0:50cedd586816 680 {
dflet 0:50cedd586816 681 int length;
dflet 0:50cedd586816 682 if (format == FORMAT_MONOCHROME)
dflet 0:50cedd586816 683 length = 8;
dflet 0:50cedd586816 684 else
dflet 0:50cedd586816 685 length = 12;
dflet 0:50cedd586816 686
dflet 0:50cedd586816 687 *pbuf++= 0xFF; // start of scan
dflet 0:50cedd586816 688 *pbuf++= 0xDA;
dflet 0:50cedd586816 689 *pbuf++= length>>8; // length field
dflet 0:50cedd586816 690 *pbuf++= length&0xFF;
dflet 0:50cedd586816 691 if (format == FORMAT_MONOCHROME)// monochrome
dflet 0:50cedd586816 692 {
dflet 0:50cedd586816 693 *pbuf++= 0x01; // number of image components in scan
dflet 0:50cedd586816 694 *pbuf++= 0x00; // scan component selector: Y
dflet 0:50cedd586816 695 *pbuf++= 0x00; // DC | AC huffman table selector: Y
dflet 0:50cedd586816 696 }
dflet 0:50cedd586816 697 else // YCbCr
dflet 0:50cedd586816 698 {
dflet 0:50cedd586816 699 *pbuf++= 0x03; // number of image components in scan
dflet 0:50cedd586816 700 *pbuf++= 0x00; // scan component selector: Y
dflet 0:50cedd586816 701 *pbuf++= 0x00; // DC | AC huffman table selector: Y
dflet 0:50cedd586816 702 *pbuf++= 0x01; // scan component selector: Cb
dflet 0:50cedd586816 703 *pbuf++= 0x11; // DC | AC huffman table selector: Cb
dflet 0:50cedd586816 704 *pbuf++= 0x02; // scan component selector: Cr
dflet 0:50cedd586816 705 *pbuf++= 0x11; // DC | AC huffman table selector: Cr
dflet 0:50cedd586816 706 }
dflet 0:50cedd586816 707
dflet 0:50cedd586816 708 *pbuf++= 0x00; // Ss: start of predictor selector
dflet 0:50cedd586816 709 *pbuf++= 0x3F; // Se: end of spectral selector
dflet 0:50cedd586816 710 *pbuf++= 0x00; // Ah | Al: successive approximation bit position
dflet 0:50cedd586816 711
dflet 0:50cedd586816 712 return (length+2);
dflet 0:50cedd586816 713 }
dflet 0:50cedd586816 714
dflet 0:50cedd586816 715
dflet 0:50cedd586816 716 //*****************************************************************************
dflet 0:50cedd586816 717 //
dflet 0:50cedd586816 718 //! DefineQuantizationTableMarker
dflet 0:50cedd586816 719 //! Calculate and write the quantisation tables
dflet 0:50cedd586816 720 //! qscale is the customised scaling factor - see MT9D131 developer guide page 78
dflet 0:50cedd586816 721 //!
dflet 0:50cedd586816 722 //! \param1 pointer to the output buffer
dflet 0:50cedd586816 723 //! \param2 Quantization Scale
dflet 0:50cedd586816 724 //! \param3 Format
dflet 0:50cedd586816 725 //!
dflet 0:50cedd586816 726 //! \return Length of the Marker
dflet 0:50cedd586816 727 //
dflet 0:50cedd586816 728 //*****************************************************************************
dflet 0:50cedd586816 729 static int DefineQuantizationTableMarker (unsigned char *pbuf, int qscale, int format)
dflet 0:50cedd586816 730 {
dflet 7:a069c1750fbc 731 // Uart_Write((uint8_t*)"DefineQuantizationTableMarker \n\r");
dflet 0:50cedd586816 732 int i, length, temp;
dflet 0:50cedd586816 733 unsigned char newtbl[64]; // temporary array to store scaled zigzagged quant entries
dflet 0:50cedd586816 734
dflet 0:50cedd586816 735 if (format == FORMAT_MONOCHROME) // monochrome
dflet 0:50cedd586816 736 length = 67;
dflet 0:50cedd586816 737 else
dflet 0:50cedd586816 738 length = 132;
dflet 0:50cedd586816 739
dflet 0:50cedd586816 740 *pbuf++ = 0xFF; // define quantization table marker
dflet 0:50cedd586816 741 *pbuf++ = 0xDB;
dflet 0:50cedd586816 742 *pbuf++ = length>>8; // length field
dflet 0:50cedd586816 743 *pbuf++ = length&0xFF;
dflet 0:50cedd586816 744 *pbuf++ = 0; // quantization table precision | identifier for luminance
dflet 0:50cedd586816 745
dflet 0:50cedd586816 746 // calculate scaled zigzagged luminance quantisation table entries
dflet 0:50cedd586816 747 for (i=0; i<64; i++) {
dflet 0:50cedd586816 748 temp = (JPEG_StdQuantTblY[i] * qscale + 16) / 32;
dflet 0:50cedd586816 749 // limit the values to the valid range
dflet 0:50cedd586816 750 if (temp <= 0)
dflet 0:50cedd586816 751 temp = 1;
dflet 0:50cedd586816 752 if (temp > 255)
dflet 0:50cedd586816 753 temp = 255;
dflet 0:50cedd586816 754 newtbl[zigzag[i]] = (unsigned char) temp;
dflet 0:50cedd586816 755 }
dflet 0:50cedd586816 756
dflet 0:50cedd586816 757 // write the resulting luminance quant table to the output buffer
dflet 0:50cedd586816 758 for (i=0; i<64; i++)
dflet 0:50cedd586816 759 *pbuf++ = newtbl[i];
dflet 0:50cedd586816 760
dflet 0:50cedd586816 761 // if format is monochrome we're finished, otherwise continue on, to do chrominance quant table
dflet 0:50cedd586816 762 if (format == FORMAT_MONOCHROME)
dflet 0:50cedd586816 763 return (length+2);
dflet 0:50cedd586816 764
dflet 0:50cedd586816 765 *pbuf++ = 1; // quantization table precision | identifier for chrominance
dflet 0:50cedd586816 766
dflet 0:50cedd586816 767 // calculate scaled zigzagged chrominance quantisation table entries
dflet 0:50cedd586816 768 for (i=0; i<64; i++) {
dflet 0:50cedd586816 769 temp = (JPEG_StdQuantTblC[i] * qscale + 16) / 32;
dflet 0:50cedd586816 770 // limit the values to the valid range
dflet 0:50cedd586816 771 if (temp <= 0)
dflet 0:50cedd586816 772 temp = 1;
dflet 0:50cedd586816 773 if (temp > 255)
dflet 0:50cedd586816 774 temp = 255;
dflet 0:50cedd586816 775 newtbl[zigzag[i]] = (unsigned char) temp;
dflet 0:50cedd586816 776 }
dflet 0:50cedd586816 777
dflet 0:50cedd586816 778 // write the resulting chrominance quant table to the output buffer
dflet 0:50cedd586816 779 for (i=0; i<64; i++)
dflet 0:50cedd586816 780 *pbuf++ = newtbl[i];
dflet 0:50cedd586816 781
dflet 0:50cedd586816 782 return (length+2);
dflet 0:50cedd586816 783 }
dflet 0:50cedd586816 784
dflet 0:50cedd586816 785
dflet 0:50cedd586816 786 //*****************************************************************************
dflet 0:50cedd586816 787 //
dflet 0:50cedd586816 788 //! DefineHuffmanTableMarkerDC
dflet 0:50cedd586816 789 //!
dflet 0:50cedd586816 790 //! \param1 pointer to Marker buffer
dflet 0:50cedd586816 791 //! \param2 Huffman table
dflet 0:50cedd586816 792 //! \param3 Class Identifier
dflet 0:50cedd586816 793 //!
dflet 0:50cedd586816 794 //! \return Length of the marker
dflet 0:50cedd586816 795 //
dflet 0:50cedd586816 796 //*****************************************************************************
dflet 0:50cedd586816 797 static int DefineHuffmanTableMarkerDC(char *pbuf, unsigned int *htable, int class_id)
dflet 0:50cedd586816 798 {
dflet 7:a069c1750fbc 799 // Uart_Write((uint8_t*)"DefineHuffmanTableMarkerDC \n\r");
dflet 0:50cedd586816 800 int i, l, count;
dflet 0:50cedd586816 801 int length;
dflet 0:50cedd586816 802 char *plength;
dflet 0:50cedd586816 803
dflet 0:50cedd586816 804 *pbuf++= 0xFF; // define huffman table marker
dflet 0:50cedd586816 805 *pbuf++= 0xC4;
dflet 0:50cedd586816 806 plength = pbuf; // place holder for length field
dflet 0:50cedd586816 807 *pbuf++;
dflet 0:50cedd586816 808 *pbuf++;
dflet 0:50cedd586816 809 *pbuf++= class_id; // huffman table class | identifier
dflet 0:50cedd586816 810
dflet 0:50cedd586816 811 for (l = 0; l < 16; l++)
dflet 0:50cedd586816 812 {
dflet 0:50cedd586816 813 count = 0;
dflet 0:50cedd586816 814 for (i = 0; i < 12; i++)
dflet 0:50cedd586816 815 {
dflet 0:50cedd586816 816 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 817 count++;
dflet 0:50cedd586816 818 }
dflet 0:50cedd586816 819 *pbuf++= count; // number of huffman codes of length l+1
dflet 0:50cedd586816 820 }
dflet 0:50cedd586816 821
dflet 0:50cedd586816 822 length = 19;
dflet 0:50cedd586816 823 for (l = 0; l < 16; l++)
dflet 0:50cedd586816 824 {
dflet 0:50cedd586816 825 for (i = 0; i < 12; i++)
dflet 0:50cedd586816 826 {
dflet 0:50cedd586816 827 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 828 {
dflet 0:50cedd586816 829 *pbuf++= i; // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 830 length++;
dflet 0:50cedd586816 831 }
dflet 0:50cedd586816 832 }
dflet 0:50cedd586816 833 }
dflet 0:50cedd586816 834
dflet 0:50cedd586816 835 *plength++= length>>8; // length field
dflet 0:50cedd586816 836 *plength = length&0xFF;
dflet 0:50cedd586816 837
dflet 0:50cedd586816 838 return (length + 2);
dflet 0:50cedd586816 839 }
dflet 0:50cedd586816 840
dflet 0:50cedd586816 841
dflet 0:50cedd586816 842 //*****************************************************************************
dflet 0:50cedd586816 843 //
dflet 0:50cedd586816 844 //! DefineHuffmanTableMarkerAC
dflet 0:50cedd586816 845 //! 1. Establishes connection w/ AP//
dflet 0:50cedd586816 846 //! 2. Initializes the camera sub-components//! GPIO Enable & Configuration
dflet 0:50cedd586816 847 //! 3. Listens and processes the image capture requests from user-applications
dflet 0:50cedd586816 848 //!
dflet 0:50cedd586816 849 //! \param1 pointer to Marker buffer
dflet 0:50cedd586816 850 //! \param2 Huffman table
dflet 0:50cedd586816 851 //! \param3 Class Identifier
dflet 0:50cedd586816 852 //!
dflet 0:50cedd586816 853 //! \return Length of the Marker
dflet 0:50cedd586816 854 //!
dflet 0:50cedd586816 855 //
dflet 0:50cedd586816 856 //*****************************************************************************
dflet 0:50cedd586816 857 static int DefineHuffmanTableMarkerAC(char *pbuf, unsigned int *htable, int class_id)
dflet 0:50cedd586816 858 {
dflet 7:a069c1750fbc 859 // Uart_Write((uint8_t*)"DefineHuffmanTableMarkerAC \n\r");
dflet 0:50cedd586816 860 int i, l, a, b, count;
dflet 0:50cedd586816 861 char *plength;
dflet 0:50cedd586816 862 int length;
dflet 0:50cedd586816 863
dflet 0:50cedd586816 864 *pbuf++= 0xFF; // define huffman table marker
dflet 0:50cedd586816 865 *pbuf++= 0xC4;
dflet 0:50cedd586816 866 plength = pbuf; // place holder for length field
dflet 0:50cedd586816 867 *pbuf++;
dflet 0:50cedd586816 868 *pbuf++;
dflet 0:50cedd586816 869 *pbuf++= class_id; // huffman table class | identifier
dflet 0:50cedd586816 870
dflet 0:50cedd586816 871 for (l = 0; l < 16; l++)
dflet 0:50cedd586816 872 {
dflet 0:50cedd586816 873 count = 0;
dflet 0:50cedd586816 874 for (i = 0; i < 162; i++)
dflet 0:50cedd586816 875 {
dflet 0:50cedd586816 876 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 877 count++;
dflet 0:50cedd586816 878 }
dflet 0:50cedd586816 879
dflet 0:50cedd586816 880 *pbuf++= count; // number of huffman codes of length l+1
dflet 0:50cedd586816 881 }
dflet 0:50cedd586816 882
dflet 0:50cedd586816 883 length = 19;
dflet 0:50cedd586816 884 for (l = 0; l < 16; l++)
dflet 0:50cedd586816 885 {
dflet 0:50cedd586816 886 // check EOB: 0|0
dflet 0:50cedd586816 887 if ((htable[160] >> 8) == l)
dflet 0:50cedd586816 888 {
dflet 0:50cedd586816 889 *pbuf++= 0; // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 890 length++;
dflet 0:50cedd586816 891 }
dflet 0:50cedd586816 892
dflet 0:50cedd586816 893 // check HUFFVAL: 0|1 to E|A
dflet 0:50cedd586816 894 for (i = 0; i < 150; i++)
dflet 0:50cedd586816 895 {
dflet 0:50cedd586816 896 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 897 {
dflet 0:50cedd586816 898 a = i/10;
dflet 0:50cedd586816 899 b = i%10;
dflet 0:50cedd586816 900 *pbuf++= (a<<4)|(b+1); // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 901 length++;
dflet 0:50cedd586816 902 }
dflet 0:50cedd586816 903 }
dflet 0:50cedd586816 904
dflet 0:50cedd586816 905 // check ZRL: F|0
dflet 0:50cedd586816 906 if ((htable[161] >> 8) == l)
dflet 0:50cedd586816 907 {
dflet 0:50cedd586816 908 *pbuf++= 0xF0; // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 909 length++;
dflet 0:50cedd586816 910 }
dflet 0:50cedd586816 911
dflet 0:50cedd586816 912 // check HUFFVAL: F|1 to F|A
dflet 0:50cedd586816 913 for (i = 150; i < 160; i++)
dflet 0:50cedd586816 914 {
dflet 0:50cedd586816 915 if ((htable[i] >> 8) == l)
dflet 0:50cedd586816 916 {
dflet 0:50cedd586816 917 a = i/10;
dflet 0:50cedd586816 918 b = i%10;
dflet 0:50cedd586816 919 *pbuf++= (a<<4)|(b+1); // HUFFVAL with huffman codes of length l+1
dflet 0:50cedd586816 920 length++;
dflet 0:50cedd586816 921 }
dflet 0:50cedd586816 922 }
dflet 0:50cedd586816 923 }
dflet 0:50cedd586816 924
dflet 0:50cedd586816 925 *plength++= length>>8; // length field
dflet 0:50cedd586816 926 *plength = length&0xFF;
dflet 0:50cedd586816 927 return (length + 2);
dflet 0:50cedd586816 928 }
dflet 0:50cedd586816 929
dflet 0:50cedd586816 930
dflet 0:50cedd586816 931 //*****************************************************************************
dflet 0:50cedd586816 932 //
dflet 0:50cedd586816 933 //! DefineRestartIntervalMarker
dflet 0:50cedd586816 934 //!
dflet 0:50cedd586816 935 //! \param1 pointer to Marker buffer
dflet 0:50cedd586816 936 //! \param2 return interval
dflet 0:50cedd586816 937 //!
dflet 0:50cedd586816 938 //! \return Length
dflet 0:50cedd586816 939 //
dflet 0:50cedd586816 940 //*****************************************************************************
dflet 0:50cedd586816 941 static int DefineRestartIntervalMarker(char *pbuf, int ri)
dflet 0:50cedd586816 942 {
dflet 7:a069c1750fbc 943 // Uart_Write((uint8_t*)"DefineRestartIntervalMarker \n\r");
dflet 0:50cedd586816 944 *pbuf++= 0xFF; // define restart interval marker
dflet 0:50cedd586816 945 *pbuf++= 0xDD;
dflet 0:50cedd586816 946 *pbuf++= 0x00; // length
dflet 0:50cedd586816 947 *pbuf++= 0x04;
dflet 0:50cedd586816 948 *pbuf++= ri >> 8; // restart interval
dflet 0:50cedd586816 949 *pbuf++= ri & 0xFF;
dflet 0:50cedd586816 950 return 6;
dflet 0:50cedd586816 951 }
dflet 0:50cedd586816 952 //*****************************************************************************
dflet 0:50cedd586816 953 //
dflet 0:50cedd586816 954 //! CreateJpegHeader
dflet 0:50cedd586816 955 //! Create JPEG Header in JFIF format
dflet 0:50cedd586816 956 //!
dflet 0:50cedd586816 957 //! \param1 header - pointer to JPEG header buffer
dflet 0:50cedd586816 958 //! \param2 width - image width
dflet 0:50cedd586816 959 //! \param3 height - image height
dflet 0:50cedd586816 960 //! \param4 format - color format (0 = YCbCr422, 1 = YCbCr420, 2 = monochrome)
dflet 0:50cedd586816 961 //! \param5 restart_int - restart marker interval
dflet 0:50cedd586816 962 //! \param6 qscale - quantization table scaling factor
dflet 0:50cedd586816 963 //!
dflet 0:50cedd586816 964 //! \return length of JPEG header (bytes)
dflet 0:50cedd586816 965 //
dflet 0:50cedd586816 966 //*****************************************************************************
dflet 0:50cedd586816 967
dflet 0:50cedd586816 968 static int CreateJpegHeader(char *header, int width, int height,
dflet 0:50cedd586816 969 int format, int restart_int, int qscale)
dflet 0:50cedd586816 970 {
dflet 7:a069c1750fbc 971 // Uart_Write((uint8_t*)"CreateJpegHeader \n\r");
dflet 0:50cedd586816 972 char *pbuf = header;
dflet 0:50cedd586816 973 int length;
dflet 0:50cedd586816 974
dflet 0:50cedd586816 975 // SOI
dflet 0:50cedd586816 976 *pbuf++= 0xFF;
dflet 0:50cedd586816 977 *pbuf++= 0xD8;
dflet 0:50cedd586816 978 length = 2;
dflet 0:50cedd586816 979
dflet 0:50cedd586816 980 // JFIF APP0
dflet 0:50cedd586816 981 length += JfifApp0Marker(pbuf);
dflet 0:50cedd586816 982
dflet 0:50cedd586816 983 // Quantization Tables
dflet 0:50cedd586816 984 pbuf = header + length;
dflet 0:50cedd586816 985 length += DefineQuantizationTableMarker((unsigned char *)pbuf, qscale, format);
dflet 0:50cedd586816 986
dflet 0:50cedd586816 987 // Frame Header
dflet 0:50cedd586816 988 pbuf = header + length;
dflet 0:50cedd586816 989 length += FrameHeaderMarker(pbuf, width, height, format);
dflet 0:50cedd586816 990
dflet 0:50cedd586816 991 // Huffman Table DC 0 for Luma
dflet 0:50cedd586816 992 pbuf = header + length;
dflet 0:50cedd586816 993 length += DefineHuffmanTableMarkerDC(pbuf, &JPEG_StdHuffmanTbl[352], 0x00);
dflet 0:50cedd586816 994
dflet 0:50cedd586816 995 // Huffman Table AC 0 for Luma
dflet 0:50cedd586816 996 pbuf = header + length;
dflet 0:50cedd586816 997 length += DefineHuffmanTableMarkerAC(pbuf, &JPEG_StdHuffmanTbl[0], 0x10);
dflet 0:50cedd586816 998
dflet 0:50cedd586816 999 if (format != FORMAT_MONOCHROME)// YCbCr
dflet 0:50cedd586816 1000 {
dflet 0:50cedd586816 1001 // Huffman Table DC 1 for Chroma
dflet 0:50cedd586816 1002 pbuf = header + length;
dflet 0:50cedd586816 1003 length += DefineHuffmanTableMarkerDC(pbuf, &JPEG_StdHuffmanTbl[368], 0x01);
dflet 0:50cedd586816 1004
dflet 0:50cedd586816 1005 // Huffman Table AC 1 for Chroma
dflet 0:50cedd586816 1006 pbuf = header + length;
dflet 0:50cedd586816 1007 length += DefineHuffmanTableMarkerAC(pbuf, &JPEG_StdHuffmanTbl[176], 0x11);
dflet 0:50cedd586816 1008 }
dflet 0:50cedd586816 1009
dflet 0:50cedd586816 1010 // Restart Interval
dflet 0:50cedd586816 1011 if (restart_int > 0)
dflet 0:50cedd586816 1012 {
dflet 0:50cedd586816 1013 pbuf = header + length;
dflet 0:50cedd586816 1014 length += DefineRestartIntervalMarker(pbuf, restart_int);
dflet 0:50cedd586816 1015 }
dflet 0:50cedd586816 1016
dflet 0:50cedd586816 1017 // Scan Header
dflet 0:50cedd586816 1018 pbuf = header + length;
dflet 0:50cedd586816 1019 length += ScanHeaderMarker(pbuf, format);
dflet 0:50cedd586816 1020
dflet 0:50cedd586816 1021 return length;
dflet 0:50cedd586816 1022 }
dflet 6:37fb696395d7 1023 #endif// jpeg defined
dflet 0:50cedd586816 1024
dflet 0:50cedd586816 1025
dflet 0:50cedd586816 1026
dflet 0:50cedd586816 1027 //*****************************************************************************
dflet 0:50cedd586816 1028 //
dflet 0:50cedd586816 1029 // Close the Doxygen group.
dflet 0:50cedd586816 1030 //! @}
dflet 0:50cedd586816 1031 //
dflet 0:50cedd586816 1032 //*****************************************************************************
dflet 0:50cedd586816 1033