Mercurial > libavcodec.hg
comparison cavs.c @ 4945:64ca10777164 libavcodec
move cavs parser in it's own file
author | aurel |
---|---|
date | Wed, 09 May 2007 00:03:17 +0000 |
parents | 5d4544d7cbbc |
children | 2b72f9bc4f06 |
comparison
equal
deleted
inserted
replaced
4944:5d4544d7cbbc | 4945:64ca10777164 |
---|---|
28 #include "avcodec.h" | 28 #include "avcodec.h" |
29 #include "bitstream.h" | 29 #include "bitstream.h" |
30 #include "golomb.h" | 30 #include "golomb.h" |
31 #include "mpegvideo.h" | 31 #include "mpegvideo.h" |
32 #include "cavs.h" | 32 #include "cavs.h" |
33 #ifdef CONFIG_CAVS_DECODER | |
34 #include "cavsdata.h" | 33 #include "cavsdata.h" |
35 | 34 |
36 typedef struct { | 35 typedef struct { |
37 MpegEncContext s; | 36 MpegEncContext s; |
38 Picture picture; ///< currently decoded frame | 37 Picture picture; ///< currently decoded frame |
1456 cavs_decode_end, | 1455 cavs_decode_end, |
1457 cavs_decode_frame, | 1456 cavs_decode_frame, |
1458 CODEC_CAP_DR1 | CODEC_CAP_DELAY, | 1457 CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
1459 .flush= cavs_flush, | 1458 .flush= cavs_flush, |
1460 }; | 1459 }; |
1461 #endif /* CONFIG_CAVS_DECODER */ | |
1462 | |
1463 #ifdef CONFIG_CAVSVIDEO_PARSER | |
1464 /** | |
1465 * finds the end of the current frame in the bitstream. | |
1466 * @return the position of the first byte of the next frame, or -1 | |
1467 */ | |
1468 static int cavs_find_frame_end(ParseContext *pc, const uint8_t *buf, | |
1469 int buf_size) { | |
1470 int pic_found, i; | |
1471 uint32_t state; | |
1472 | |
1473 pic_found= pc->frame_start_found; | |
1474 state= pc->state; | |
1475 | |
1476 i=0; | |
1477 if(!pic_found){ | |
1478 for(i=0; i<buf_size; i++){ | |
1479 state= (state<<8) | buf[i]; | |
1480 if(state == PIC_I_START_CODE || state == PIC_PB_START_CODE){ | |
1481 i++; | |
1482 pic_found=1; | |
1483 break; | |
1484 } | |
1485 } | |
1486 } | |
1487 | |
1488 if(pic_found){ | |
1489 /* EOF considered as end of frame */ | |
1490 if (buf_size == 0) | |
1491 return 0; | |
1492 for(; i<buf_size; i++){ | |
1493 state= (state<<8) | buf[i]; | |
1494 if((state&0xFFFFFF00) == 0x100){ | |
1495 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ | |
1496 pc->frame_start_found=0; | |
1497 pc->state=-1; | |
1498 return i-3; | |
1499 } | |
1500 } | |
1501 } | |
1502 } | |
1503 pc->frame_start_found= pic_found; | |
1504 pc->state= state; | |
1505 return END_NOT_FOUND; | |
1506 } | |
1507 | |
1508 static int cavsvideo_parse(AVCodecParserContext *s, | |
1509 AVCodecContext *avctx, | |
1510 const uint8_t **poutbuf, int *poutbuf_size, | |
1511 const uint8_t *buf, int buf_size) | |
1512 { | |
1513 ParseContext *pc = s->priv_data; | |
1514 int next; | |
1515 | |
1516 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ | |
1517 next= buf_size; | |
1518 }else{ | |
1519 next= cavs_find_frame_end(pc, buf, buf_size); | |
1520 | |
1521 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { | |
1522 *poutbuf = NULL; | |
1523 *poutbuf_size = 0; | |
1524 return buf_size; | |
1525 } | |
1526 } | |
1527 *poutbuf = buf; | |
1528 *poutbuf_size = buf_size; | |
1529 return next; | |
1530 } | |
1531 | |
1532 AVCodecParser cavsvideo_parser = { | |
1533 { CODEC_ID_CAVS }, | |
1534 sizeof(ParseContext1), | |
1535 NULL, | |
1536 cavsvideo_parse, | |
1537 ff_parse1_close, | |
1538 ff_mpeg4video_split, | |
1539 }; | |
1540 #endif /* CONFIG_CAVSVIDEO_PARSER */ |