Mercurial > libavcodec.hg
comparison mpeg12.c @ 4915:c22e10113015 libavcodec
move mpegvideo_parser in it's own file
author | aurel |
---|---|
date | Sat, 05 May 2007 18:18:51 +0000 |
parents | 185f5e4feb72 |
children | 13ef168891b0 |
comparison
equal
deleted
inserted
replaced
4914:b0a24fa7cbea | 4915:c22e10113015 |
---|---|
34 #include "bytestream.h" | 34 #include "bytestream.h" |
35 | 35 |
36 //#undef NDEBUG | 36 //#undef NDEBUG |
37 //#include <assert.h> | 37 //#include <assert.h> |
38 | 38 |
39 | |
40 /* Start codes. */ | |
41 #define SEQ_END_CODE 0x000001b7 | |
42 #define SEQ_START_CODE 0x000001b3 | |
43 #define GOP_START_CODE 0x000001b8 | |
44 #define PICTURE_START_CODE 0x00000100 | |
45 #define SLICE_MIN_START_CODE 0x00000101 | |
46 #define SLICE_MAX_START_CODE 0x000001af | |
47 #define EXT_START_CODE 0x000001b5 | |
48 #define USER_START_CODE 0x000001b2 | |
49 | 39 |
50 #define DC_VLC_BITS 9 | 40 #define DC_VLC_BITS 9 |
51 #define MV_VLC_BITS 9 | 41 #define MV_VLC_BITS 9 |
52 #define MBINCR_VLC_BITS 9 | 42 #define MBINCR_VLC_BITS 9 |
53 #define MB_PAT_VLC_BITS 9 | 43 #define MB_PAT_VLC_BITS 9 |
3040 } | 3030 } |
3041 /** | 3031 /** |
3042 * finds the end of the current frame in the bitstream. | 3032 * finds the end of the current frame in the bitstream. |
3043 * @return the position of the first byte of the next frame, or -1 | 3033 * @return the position of the first byte of the next frame, or -1 |
3044 */ | 3034 */ |
3045 static int mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) | 3035 int mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) |
3046 { | 3036 { |
3047 int i; | 3037 int i; |
3048 uint32_t state= pc->state; | 3038 uint32_t state= pc->state; |
3049 | 3039 |
3050 i=0; | 3040 i=0; |
3362 .flush= ff_mpeg_flush, | 3352 .flush= ff_mpeg_flush, |
3363 }; | 3353 }; |
3364 | 3354 |
3365 #endif | 3355 #endif |
3366 | 3356 |
3367 #ifdef CONFIG_MPEGVIDEO_PARSER | |
3368 static void mpegvideo_extract_headers(AVCodecParserContext *s, | |
3369 AVCodecContext *avctx, | |
3370 const uint8_t *buf, int buf_size) | |
3371 { | |
3372 ParseContext1 *pc = s->priv_data; | |
3373 const uint8_t *buf_end; | |
3374 uint32_t start_code; | |
3375 int frame_rate_index, ext_type, bytes_left; | |
3376 int frame_rate_ext_n, frame_rate_ext_d; | |
3377 int picture_structure, top_field_first, repeat_first_field, progressive_frame; | |
3378 int horiz_size_ext, vert_size_ext, bit_rate_ext; | |
3379 //FIXME replace the crap with get_bits() | |
3380 s->repeat_pict = 0; | |
3381 buf_end = buf + buf_size; | |
3382 while (buf < buf_end) { | |
3383 start_code= -1; | |
3384 buf= ff_find_start_code(buf, buf_end, &start_code); | |
3385 bytes_left = buf_end - buf; | |
3386 switch(start_code) { | |
3387 case PICTURE_START_CODE: | |
3388 if (bytes_left >= 2) { | |
3389 s->pict_type = (buf[1] >> 3) & 7; | |
3390 } | |
3391 break; | |
3392 case SEQ_START_CODE: | |
3393 if (bytes_left >= 7) { | |
3394 pc->width = (buf[0] << 4) | (buf[1] >> 4); | |
3395 pc->height = ((buf[1] & 0x0f) << 8) | buf[2]; | |
3396 avcodec_set_dimensions(avctx, pc->width, pc->height); | |
3397 frame_rate_index = buf[3] & 0xf; | |
3398 pc->frame_rate.den = avctx->time_base.den = ff_frame_rate_tab[frame_rate_index].num; | |
3399 pc->frame_rate.num = avctx->time_base.num = ff_frame_rate_tab[frame_rate_index].den; | |
3400 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400; | |
3401 avctx->codec_id = CODEC_ID_MPEG1VIDEO; | |
3402 avctx->sub_id = 1; | |
3403 } | |
3404 break; | |
3405 case EXT_START_CODE: | |
3406 if (bytes_left >= 1) { | |
3407 ext_type = (buf[0] >> 4); | |
3408 switch(ext_type) { | |
3409 case 0x1: /* sequence extension */ | |
3410 if (bytes_left >= 6) { | |
3411 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7); | |
3412 vert_size_ext = (buf[2] >> 5) & 3; | |
3413 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1); | |
3414 frame_rate_ext_n = (buf[5] >> 5) & 3; | |
3415 frame_rate_ext_d = (buf[5] & 0x1f); | |
3416 pc->progressive_sequence = buf[1] & (1 << 3); | |
3417 avctx->has_b_frames= !(buf[5] >> 7); | |
3418 | |
3419 pc->width |=(horiz_size_ext << 12); | |
3420 pc->height |=( vert_size_ext << 12); | |
3421 avctx->bit_rate += (bit_rate_ext << 18) * 400; | |
3422 avcodec_set_dimensions(avctx, pc->width, pc->height); | |
3423 avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1); | |
3424 avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1); | |
3425 avctx->codec_id = CODEC_ID_MPEG2VIDEO; | |
3426 avctx->sub_id = 2; /* forces MPEG2 */ | |
3427 } | |
3428 break; | |
3429 case 0x8: /* picture coding extension */ | |
3430 if (bytes_left >= 5) { | |
3431 picture_structure = buf[2]&3; | |
3432 top_field_first = buf[3] & (1 << 7); | |
3433 repeat_first_field = buf[3] & (1 << 1); | |
3434 progressive_frame = buf[4] & (1 << 7); | |
3435 | |
3436 /* check if we must repeat the frame */ | |
3437 if (repeat_first_field) { | |
3438 if (pc->progressive_sequence) { | |
3439 if (top_field_first) | |
3440 s->repeat_pict = 4; | |
3441 else | |
3442 s->repeat_pict = 2; | |
3443 } else if (progressive_frame) { | |
3444 s->repeat_pict = 1; | |
3445 } | |
3446 } | |
3447 | |
3448 /* the packet only represents half a frame | |
3449 XXX,FIXME maybe find a different solution */ | |
3450 if(picture_structure != 3) | |
3451 s->repeat_pict = -1; | |
3452 } | |
3453 break; | |
3454 } | |
3455 } | |
3456 break; | |
3457 case -1: | |
3458 goto the_end; | |
3459 default: | |
3460 /* we stop parsing when we encounter a slice. It ensures | |
3461 that this function takes a negligible amount of time */ | |
3462 if (start_code >= SLICE_MIN_START_CODE && | |
3463 start_code <= SLICE_MAX_START_CODE) | |
3464 goto the_end; | |
3465 break; | |
3466 } | |
3467 } | |
3468 the_end: ; | |
3469 } | |
3470 | |
3471 static int mpegvideo_parse(AVCodecParserContext *s, | |
3472 AVCodecContext *avctx, | |
3473 uint8_t **poutbuf, int *poutbuf_size, | |
3474 const uint8_t *buf, int buf_size) | |
3475 { | |
3476 ParseContext1 *pc1 = s->priv_data; | |
3477 ParseContext *pc= &pc1->pc; | |
3478 int next; | |
3479 | |
3480 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ | |
3481 next= buf_size; | |
3482 }else{ | |
3483 next= mpeg1_find_frame_end(pc, buf, buf_size); | |
3484 | |
3485 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) { | |
3486 *poutbuf = NULL; | |
3487 *poutbuf_size = 0; | |
3488 return buf_size; | |
3489 } | |
3490 | |
3491 } | |
3492 /* we have a full frame : we just parse the first few MPEG headers | |
3493 to have the full timing information. The time take by this | |
3494 function should be negligible for uncorrupted streams */ | |
3495 mpegvideo_extract_headers(s, avctx, buf, buf_size); | |
3496 #if 0 | |
3497 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n", | |
3498 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict); | |
3499 #endif | |
3500 | |
3501 *poutbuf = (uint8_t *)buf; | |
3502 *poutbuf_size = buf_size; | |
3503 return next; | |
3504 } | |
3505 | |
3506 static int mpegvideo_split(AVCodecContext *avctx, | |
3507 const uint8_t *buf, int buf_size) | |
3508 { | |
3509 int i; | |
3510 uint32_t state= -1; | |
3511 | |
3512 for(i=0; i<buf_size; i++){ | |
3513 state= (state<<8) | buf[i]; | |
3514 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100) | |
3515 return i-3; | |
3516 } | |
3517 return 0; | |
3518 } | |
3519 | |
3520 AVCodecParser mpegvideo_parser = { | |
3521 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO }, | |
3522 sizeof(ParseContext1), | |
3523 NULL, | |
3524 mpegvideo_parse, | |
3525 ff_parse1_close, | |
3526 mpegvideo_split, | |
3527 }; | |
3528 #endif /* !CONFIG_MPEGVIDEO_PARSER */ | |
3529 | |
3530 static int imx_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | 3357 static int imx_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, |
3531 uint8_t **poutbuf, int *poutbuf_size, | 3358 uint8_t **poutbuf, int *poutbuf_size, |
3532 const uint8_t *buf, int buf_size, int keyframe) | 3359 const uint8_t *buf, int buf_size, int keyframe) |
3533 { | 3360 { |
3534 /* MXF essence element key */ | 3361 /* MXF essence element key */ |