00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "parser.h"
00024 #include "mpegvideo.h"
00025
00026 static void mpegvideo_extract_headers(AVCodecParserContext *s,
00027 AVCodecContext *avctx,
00028 const uint8_t *buf, int buf_size)
00029 {
00030 ParseContext1 *pc = s->priv_data;
00031 const uint8_t *buf_end;
00032 const uint8_t *buf_start= buf;
00033 uint32_t start_code;
00034 int frame_rate_index, ext_type, bytes_left;
00035 int frame_rate_ext_n, frame_rate_ext_d;
00036 int picture_structure, top_field_first, repeat_first_field, progressive_frame;
00037 int horiz_size_ext, vert_size_ext, bit_rate_ext;
00038
00039 s->repeat_pict = 0;
00040 buf_end = buf + buf_size;
00041 while (buf < buf_end) {
00042 start_code= -1;
00043 buf= ff_find_start_code(buf, buf_end, &start_code);
00044 bytes_left = buf_end - buf;
00045 switch(start_code) {
00046 case PICTURE_START_CODE:
00047 ff_fetch_timestamp(s, buf-buf_start-4, 1);
00048
00049 if (bytes_left >= 2) {
00050 s->pict_type = (buf[1] >> 3) & 7;
00051 }
00052 break;
00053 case SEQ_START_CODE:
00054 if (bytes_left >= 7) {
00055 pc->width = (buf[0] << 4) | (buf[1] >> 4);
00056 pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
00057 avcodec_set_dimensions(avctx, pc->width, pc->height);
00058 frame_rate_index = buf[3] & 0xf;
00059 pc->frame_rate.den = avctx->time_base.den = ff_frame_rate_tab[frame_rate_index].num;
00060 pc->frame_rate.num = avctx->time_base.num = ff_frame_rate_tab[frame_rate_index].den;
00061 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
00062 avctx->codec_id = CODEC_ID_MPEG1VIDEO;
00063 avctx->sub_id = 1;
00064 }
00065 break;
00066 case EXT_START_CODE:
00067 if (bytes_left >= 1) {
00068 ext_type = (buf[0] >> 4);
00069 switch(ext_type) {
00070 case 0x1:
00071 if (bytes_left >= 6) {
00072 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7);
00073 vert_size_ext = (buf[2] >> 5) & 3;
00074 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1);
00075 frame_rate_ext_n = (buf[5] >> 5) & 3;
00076 frame_rate_ext_d = (buf[5] & 0x1f);
00077 pc->progressive_sequence = buf[1] & (1 << 3);
00078 avctx->has_b_frames= !(buf[5] >> 7);
00079
00080 pc->width |=(horiz_size_ext << 12);
00081 pc->height |=( vert_size_ext << 12);
00082 avctx->bit_rate += (bit_rate_ext << 18) * 400;
00083 avcodec_set_dimensions(avctx, pc->width, pc->height);
00084 avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1) * 2;
00085 avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1);
00086 avctx->codec_id = CODEC_ID_MPEG2VIDEO;
00087 avctx->sub_id = 2;
00088 }
00089 break;
00090 case 0x8:
00091 if (bytes_left >= 5) {
00092 picture_structure = buf[2]&3;
00093 top_field_first = buf[3] & (1 << 7);
00094 repeat_first_field = buf[3] & (1 << 1);
00095 progressive_frame = buf[4] & (1 << 7);
00096
00097
00098 s->repeat_pict = 1;
00099 if (repeat_first_field) {
00100 if (pc->progressive_sequence) {
00101 if (top_field_first)
00102 s->repeat_pict = 5;
00103 else
00104 s->repeat_pict = 3;
00105 } else if (progressive_frame) {
00106 s->repeat_pict = 2;
00107 }
00108 }
00109 }
00110 break;
00111 }
00112 }
00113 break;
00114 case -1:
00115 goto the_end;
00116 default:
00117
00118
00119 if (start_code >= SLICE_MIN_START_CODE &&
00120 start_code <= SLICE_MAX_START_CODE)
00121 goto the_end;
00122 break;
00123 }
00124 }
00125 the_end: ;
00126 }
00127
00128 static int mpegvideo_parse(AVCodecParserContext *s,
00129 AVCodecContext *avctx,
00130 const uint8_t **poutbuf, int *poutbuf_size,
00131 const uint8_t *buf, int buf_size)
00132 {
00133 ParseContext1 *pc1 = s->priv_data;
00134 ParseContext *pc= &pc1->pc;
00135 int next;
00136
00137 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
00138 next= buf_size;
00139 }else{
00140 next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
00141
00142 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
00143 *poutbuf = NULL;
00144 *poutbuf_size = 0;
00145 return buf_size;
00146 }
00147
00148 }
00149
00150
00151
00152 mpegvideo_extract_headers(s, avctx, buf, buf_size);
00153 #if 0
00154 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
00155 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
00156 #endif
00157
00158 *poutbuf = buf;
00159 *poutbuf_size = buf_size;
00160 return next;
00161 }
00162
00163 static int mpegvideo_split(AVCodecContext *avctx,
00164 const uint8_t *buf, int buf_size)
00165 {
00166 int i;
00167 uint32_t state= -1;
00168
00169 for(i=0; i<buf_size; i++){
00170 state= (state<<8) | buf[i];
00171 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
00172 return i-3;
00173 }
00174 return 0;
00175 }
00176
00177 AVCodecParser mpegvideo_parser = {
00178 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
00179 sizeof(ParseContext1),
00180 NULL,
00181 mpegvideo_parse,
00182 ff_parse1_close,
00183 };