|
@@ -31,6 +31,7 @@
|
|
|
#include "mpegvideo.h"
|
|
|
#include "cavsdata.h"
|
|
|
|
|
|
+#ifdef CONFIG_CAVS_DECODER
|
|
|
typedef struct {
|
|
|
MpegEncContext s;
|
|
|
Picture picture; ///< currently decoded frame
|
|
@@ -1318,49 +1319,6 @@ static int decode_seq_header(AVSContext *h) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * finds the end of the current frame in the bitstream.
|
|
|
- * @return the position of the first byte of the next frame, or -1
|
|
|
- */
|
|
|
-int ff_cavs_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) {
|
|
|
- int pic_found, i;
|
|
|
- uint32_t state;
|
|
|
-
|
|
|
- pic_found= pc->frame_start_found;
|
|
|
- state= pc->state;
|
|
|
-
|
|
|
- i=0;
|
|
|
- if(!pic_found){
|
|
|
- for(i=0; i<buf_size; i++){
|
|
|
- state= (state<<8) | buf[i];
|
|
|
- if(state == PIC_I_START_CODE || state == PIC_PB_START_CODE){
|
|
|
- i++;
|
|
|
- pic_found=1;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(pic_found){
|
|
|
- /* EOF considered as end of frame */
|
|
|
- if (buf_size == 0)
|
|
|
- return 0;
|
|
|
- for(; i<buf_size; i++){
|
|
|
- state= (state<<8) | buf[i];
|
|
|
- if((state&0xFFFFFF00) == 0x100){
|
|
|
- if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){
|
|
|
- pc->frame_start_found=0;
|
|
|
- pc->state=-1;
|
|
|
- return i-3;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- pc->frame_start_found= pic_found;
|
|
|
- pc->state= state;
|
|
|
- return END_NOT_FOUND;
|
|
|
-}
|
|
|
-
|
|
|
void ff_cavs_flush(AVCodecContext * avctx) {
|
|
|
AVSContext *h = avctx->priv_data;
|
|
|
h->got_keyframe = 0;
|
|
@@ -1500,3 +1458,83 @@ AVCodec cavs_decoder = {
|
|
|
CODEC_CAP_DR1 | CODEC_CAP_DELAY,
|
|
|
.flush= ff_cavs_flush,
|
|
|
};
|
|
|
+#endif /* CONFIG_CAVS_DECODER */
|
|
|
+
|
|
|
+#ifdef CONFIG_CAVSVIDEO_PARSER
|
|
|
+/**
|
|
|
+ * finds the end of the current frame in the bitstream.
|
|
|
+ * @return the position of the first byte of the next frame, or -1
|
|
|
+ */
|
|
|
+static int cavs_find_frame_end(ParseContext *pc, const uint8_t *buf,
|
|
|
+ int buf_size) {
|
|
|
+ int pic_found, i;
|
|
|
+ uint32_t state;
|
|
|
+
|
|
|
+ pic_found= pc->frame_start_found;
|
|
|
+ state= pc->state;
|
|
|
+
|
|
|
+ i=0;
|
|
|
+ if(!pic_found){
|
|
|
+ for(i=0; i<buf_size; i++){
|
|
|
+ state= (state<<8) | buf[i];
|
|
|
+ if(state == PIC_I_START_CODE || state == PIC_PB_START_CODE){
|
|
|
+ i++;
|
|
|
+ pic_found=1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(pic_found){
|
|
|
+ /* EOF considered as end of frame */
|
|
|
+ if (buf_size == 0)
|
|
|
+ return 0;
|
|
|
+ for(; i<buf_size; i++){
|
|
|
+ state= (state<<8) | buf[i];
|
|
|
+ if((state&0xFFFFFF00) == 0x100){
|
|
|
+ if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){
|
|
|
+ pc->frame_start_found=0;
|
|
|
+ pc->state=-1;
|
|
|
+ return i-3;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pc->frame_start_found= pic_found;
|
|
|
+ pc->state= state;
|
|
|
+ return END_NOT_FOUND;
|
|
|
+}
|
|
|
+
|
|
|
+static int cavsvideo_parse(AVCodecParserContext *s,
|
|
|
+ AVCodecContext *avctx,
|
|
|
+ uint8_t **poutbuf, int *poutbuf_size,
|
|
|
+ const uint8_t *buf, int buf_size)
|
|
|
+{
|
|
|
+ ParseContext *pc = s->priv_data;
|
|
|
+ int next;
|
|
|
+
|
|
|
+ if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
|
|
|
+ next= buf_size;
|
|
|
+ }else{
|
|
|
+ next= cavs_find_frame_end(pc, buf, buf_size);
|
|
|
+
|
|
|
+ if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
|
|
|
+ *poutbuf = NULL;
|
|
|
+ *poutbuf_size = 0;
|
|
|
+ return buf_size;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ *poutbuf = (uint8_t *)buf;
|
|
|
+ *poutbuf_size = buf_size;
|
|
|
+ return next;
|
|
|
+}
|
|
|
+
|
|
|
+AVCodecParser cavsvideo_parser = {
|
|
|
+ { CODEC_ID_CAVS },
|
|
|
+ sizeof(ParseContext1),
|
|
|
+ NULL,
|
|
|
+ cavsvideo_parse,
|
|
|
+ ff_parse1_close,
|
|
|
+ ff_mpeg4video_split,
|
|
|
+};
|
|
|
+#endif /* CONFIG_CAVSVIDEO_PARSER */
|