| 
									
										
										
										
											2007-05-13 23:16:56 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * MJPEG encoder and decoder | 
					
						
							| 
									
										
										
										
											2009-01-19 15:46:40 +00:00
										 |  |  |  * Copyright (c) 2000, 2001 Fabrice Bellard | 
					
						
							| 
									
										
										
										
											2007-05-13 23:16:56 +00:00
										 |  |  |  * Copyright (c) 2003 Alex Beregszaszi | 
					
						
							|  |  |  |  * Copyright (c) 2003-2004 Michael Niedermayer | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-07-05 10:37:29 +00:00
										 |  |  |  * Support for external huffman table, various fixes (AVID workaround), | 
					
						
							|  |  |  |  * aspecting, new decode_frame mechanism and apple mjpeg-b support | 
					
						
							|  |  |  |  *                                  by Alex Beregszaszi | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-05-13 23:16:56 +00:00
										 |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License along with FFmpeg; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-04-20 14:45:34 +00:00
										 |  |  |  * @file | 
					
						
							| 
									
										
										
										
											2007-05-13 23:16:56 +00:00
										 |  |  |  * MJPEG encoder and decoder. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-31 07:39:47 +00:00
										 |  |  | #ifndef AVCODEC_MJPEG_H
 | 
					
						
							|  |  |  | #define AVCODEC_MJPEG_H
 | 
					
						
							| 
									
										
										
										
											2007-05-13 23:16:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "avcodec.h"
 | 
					
						
							| 
									
										
										
										
											2009-04-12 08:35:26 +00:00
										 |  |  | #include "put_bits.h"
 | 
					
						
							| 
									
										
										
										
											2007-05-13 23:16:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* JPEG marker codes */ | 
					
						
							|  |  |  | typedef enum { | 
					
						
							|  |  |  |     /* start of frame */ | 
					
						
							|  |  |  |     SOF0  = 0xc0,       /* baseline */ | 
					
						
							|  |  |  |     SOF1  = 0xc1,       /* extended sequential, huffman */ | 
					
						
							|  |  |  |     SOF2  = 0xc2,       /* progressive, huffman */ | 
					
						
							|  |  |  |     SOF3  = 0xc3,       /* lossless, huffman */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SOF5  = 0xc5,       /* differential sequential, huffman */ | 
					
						
							|  |  |  |     SOF6  = 0xc6,       /* differential progressive, huffman */ | 
					
						
							|  |  |  |     SOF7  = 0xc7,       /* differential lossless, huffman */ | 
					
						
							|  |  |  |     JPG   = 0xc8,       /* reserved for JPEG extension */ | 
					
						
							|  |  |  |     SOF9  = 0xc9,       /* extended sequential, arithmetic */ | 
					
						
							|  |  |  |     SOF10 = 0xca,       /* progressive, arithmetic */ | 
					
						
							|  |  |  |     SOF11 = 0xcb,       /* lossless, arithmetic */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SOF13 = 0xcd,       /* differential sequential, arithmetic */ | 
					
						
							|  |  |  |     SOF14 = 0xce,       /* differential progressive, arithmetic */ | 
					
						
							|  |  |  |     SOF15 = 0xcf,       /* differential lossless, arithmetic */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     DHT   = 0xc4,       /* define huffman tables */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     DAC   = 0xcc,       /* define arithmetic-coding conditioning */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* restart with modulo 8 count "m" */ | 
					
						
							|  |  |  |     RST0  = 0xd0, | 
					
						
							|  |  |  |     RST1  = 0xd1, | 
					
						
							|  |  |  |     RST2  = 0xd2, | 
					
						
							|  |  |  |     RST3  = 0xd3, | 
					
						
							|  |  |  |     RST4  = 0xd4, | 
					
						
							|  |  |  |     RST5  = 0xd5, | 
					
						
							|  |  |  |     RST6  = 0xd6, | 
					
						
							|  |  |  |     RST7  = 0xd7, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SOI   = 0xd8,       /* start of image */ | 
					
						
							|  |  |  |     EOI   = 0xd9,       /* end of image */ | 
					
						
							|  |  |  |     SOS   = 0xda,       /* start of scan */ | 
					
						
							|  |  |  |     DQT   = 0xdb,       /* define quantization tables */ | 
					
						
							|  |  |  |     DNL   = 0xdc,       /* define number of lines */ | 
					
						
							|  |  |  |     DRI   = 0xdd,       /* define restart interval */ | 
					
						
							|  |  |  |     DHP   = 0xde,       /* define hierarchical progression */ | 
					
						
							|  |  |  |     EXP   = 0xdf,       /* expand reference components */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     APP0  = 0xe0, | 
					
						
							|  |  |  |     APP1  = 0xe1, | 
					
						
							|  |  |  |     APP2  = 0xe2, | 
					
						
							|  |  |  |     APP3  = 0xe3, | 
					
						
							|  |  |  |     APP4  = 0xe4, | 
					
						
							|  |  |  |     APP5  = 0xe5, | 
					
						
							|  |  |  |     APP6  = 0xe6, | 
					
						
							|  |  |  |     APP7  = 0xe7, | 
					
						
							|  |  |  |     APP8  = 0xe8, | 
					
						
							|  |  |  |     APP9  = 0xe9, | 
					
						
							|  |  |  |     APP10 = 0xea, | 
					
						
							|  |  |  |     APP11 = 0xeb, | 
					
						
							|  |  |  |     APP12 = 0xec, | 
					
						
							|  |  |  |     APP13 = 0xed, | 
					
						
							|  |  |  |     APP14 = 0xee, | 
					
						
							|  |  |  |     APP15 = 0xef, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     JPG0  = 0xf0, | 
					
						
							|  |  |  |     JPG1  = 0xf1, | 
					
						
							|  |  |  |     JPG2  = 0xf2, | 
					
						
							|  |  |  |     JPG3  = 0xf3, | 
					
						
							|  |  |  |     JPG4  = 0xf4, | 
					
						
							|  |  |  |     JPG5  = 0xf5, | 
					
						
							|  |  |  |     JPG6  = 0xf6, | 
					
						
							|  |  |  |     SOF48 = 0xf7,       ///< JPEG-LS
 | 
					
						
							|  |  |  |     LSE   = 0xf8,       ///< JPEG-LS extension parameters
 | 
					
						
							|  |  |  |     JPG9  = 0xf9, | 
					
						
							|  |  |  |     JPG10 = 0xfa, | 
					
						
							|  |  |  |     JPG11 = 0xfb, | 
					
						
							|  |  |  |     JPG12 = 0xfc, | 
					
						
							|  |  |  |     JPG13 = 0xfd, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     COM   = 0xfe,       /* comment */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     TEM   = 0x01,       /* temporary private use for arithmetic coding */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* 0x02 -> 0xbf reserved */ | 
					
						
							|  |  |  | } JPEG_MARKER; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void put_marker(PutBitContext *p, int code) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     put_bits(p, 8, 0xff); | 
					
						
							|  |  |  |     put_bits(p, 8, code); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-17 16:29:11 +00:00
										 |  |  | #define PREDICT(ret, topleft, top, left, predictor)\
 | 
					
						
							|  |  |  |     switch(predictor){\ | 
					
						
							|  |  |  |         case 1: ret= left; break;\ | 
					
						
							|  |  |  |         case 2: ret= top; break;\ | 
					
						
							|  |  |  |         case 3: ret= topleft; break;\ | 
					
						
							|  |  |  |         case 4: ret= left   +   top - topleft; break;\ | 
					
						
							|  |  |  |         case 5: ret= left   + ((top - topleft)>>1); break;\ | 
					
						
							|  |  |  |         case 6: ret= top + ((left   - topleft)>>1); break;\ | 
					
						
							|  |  |  |         default:\ | 
					
						
							|  |  |  |         case 7: ret= (left + top)>>1; break;\ | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-17 16:45:55 +00:00
										 |  |  | extern const uint8_t ff_mjpeg_bits_dc_luminance[]; | 
					
						
							| 
									
										
										
										
											2008-06-25 11:33:49 +00:00
										 |  |  | extern const uint8_t ff_mjpeg_val_dc[]; | 
					
						
							| 
									
										
										
										
											2007-05-17 16:29:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-17 16:45:55 +00:00
										 |  |  | extern const uint8_t ff_mjpeg_bits_dc_chrominance[]; | 
					
						
							| 
									
										
										
										
											2007-05-17 16:29:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-17 16:45:55 +00:00
										 |  |  | extern const uint8_t ff_mjpeg_bits_ac_luminance[]; | 
					
						
							|  |  |  | extern const uint8_t ff_mjpeg_val_ac_luminance[]; | 
					
						
							| 
									
										
										
										
											2007-05-17 16:29:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-17 16:45:55 +00:00
										 |  |  | extern const uint8_t ff_mjpeg_bits_ac_chrominance[]; | 
					
						
							|  |  |  | extern const uint8_t ff_mjpeg_val_ac_chrominance[]; | 
					
						
							| 
									
										
										
										
											2007-05-17 16:29:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-17 16:45:55 +00:00
										 |  |  | void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code, | 
					
						
							|  |  |  |                                   const uint8_t *bits_table, | 
					
						
							|  |  |  |                                   const uint8_t *val_table); | 
					
						
							| 
									
										
										
										
											2007-05-17 16:29:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-31 07:39:47 +00:00
										 |  |  | #endif /* AVCODEC_MJPEG_H */
 |