summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/mjpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libffmpeg/libavcodec/mjpeg.c')
-rw-r--r--src/libffmpeg/libavcodec/mjpeg.c67
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;
}