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