diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/mjpeg.c')
-rw-r--r-- | src/libffmpeg/libavcodec/mjpeg.c | 67 |
1 files changed, 52 insertions, 15 deletions
diff --git a/src/libffmpeg/libavcodec/mjpeg.c b/src/libffmpeg/libavcodec/mjpeg.c index c4ebee634..6cfd83160 100644 --- a/src/libffmpeg/libavcodec/mjpeg.c +++ b/src/libffmpeg/libavcodec/mjpeg.c @@ -16,8 +16,9 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Support for external huffman table and various fixes (AVID workaround) by - * Alex Beregszaszi <alex@naxine.org> + * Support for external huffman table, various fixes (AVID workaround), + * aspecting and various markers support + * by Alex Beregszaszi <alex@naxine.org> */ //#define DEBUG #include "avcodec.h" @@ -354,30 +355,53 @@ static void jpeg_put_comments(MpegEncContext *s) int size; UINT8 *ptr; -#if 0 + if (s->aspect_ratio_info) + { /* JFIF header */ put_marker(p, APP0); put_bits(p, 16, 16); put_string(p, "JFIF"); /* this puts the trailing zero-byte too */ - put_bits(p, 16, 0x101); + put_bits(p, 16, 0x0201); /* v 1.02 */ put_bits(p, 8, 0); /* units type: 0 - aspect ratio */ - put_bits(p, 16, 1); /* aspect: 1:1 */ - put_bits(p, 16, 1); + switch(s->aspect_ratio_info) + { + case FF_ASPECT_4_3_625: + case FF_ASPECT_4_3_525: + put_bits(p, 16, 4); + put_bits(p, 16, 3); + break; + case FF_ASPECT_16_9_625: + case FF_ASPECT_16_9_525: + put_bits(p, 16, 16); + put_bits(p, 16, 9); + break; + case FF_ASPECT_EXTENDED: + put_bits(p, 16, s->aspected_width); + put_bits(p, 16, s->aspected_height); + break; + case FF_ASPECT_SQUARE: + default: + put_bits(p, 16, 1); /* aspect: 1:1 */ + put_bits(p, 16, 1); + break; + } put_bits(p, 8, 0); /* thumbnail width */ put_bits(p, 8, 0); /* thumbnail height */ -#endif + } /* comment */ - put_marker(p, COM); - flush_put_bits(p); - ptr = pbBufPtr(p); - put_bits(p, 16, 0); /* patched later */ + if(!ff_bit_exact){ + put_marker(p, COM); + flush_put_bits(p); + ptr = pbBufPtr(p); + put_bits(p, 16, 0); /* patched later */ #define MJPEG_VERSION "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR - put_string(p, MJPEG_VERSION); - size = strlen(MJPEG_VERSION)+3; + put_string(p, MJPEG_VERSION); + size = strlen(MJPEG_VERSION)+3; #undef MJPEG_VERSION - ptr[0] = size >> 8; - ptr[1] = size; + ptr[0] = size >> 8; + ptr[1] = size; + } } void mjpeg_picture_header(MpegEncContext *s) @@ -1084,6 +1108,19 @@ static int mjpeg_decode_app(MJpegDecodeContext *s, skip_bits(&s->gb, 8); /* the trailing zero-byte */ printf("mjpeg: JFIF header found (version: %x.%x)\n", get_bits(&s->gb, 8), get_bits(&s->gb, 8)); + if (get_bits(&s->gb, 8) == 0) + { + s->avctx->aspect_ratio_info = FF_ASPECT_EXTENDED; + s->avctx->aspected_width = get_bits(&s->gb, 16); + s->avctx->aspected_height = get_bits(&s->gb, 16); + } + else + { + skip_bits(&s->gb, 16); + skip_bits(&s->gb, 16); + } + skip_bits(&s->gb, 8); + skip_bits(&s->gb, 8); goto out; } |