comparison h263.c @ 231:840cd25bf259 libavcodec

- Fixes on RTP and GOB headers for H.263. - RTP callback system implemented for H.263/H.263+. - Bug fix on DC coefficients of H.263. - H.263 decoder now returns PTS on picture number.
author pulento
date Sat, 09 Feb 2002 16:59:56 +0000
parents ac5075a55488
children 5fc0c3af3fe4
comparison
equal deleted inserted replaced
230:ba9cd6fb6f0e 231:840cd25bf259
60 void h263_encode_picture_header(MpegEncContext * s, int picture_number) 60 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
61 { 61 {
62 int format; 62 int format;
63 63
64 align_put_bits(&s->pb); 64 align_put_bits(&s->pb);
65 put_bits(&s->pb, 22, 0x20); 65
66 /* Update the pointer to last GOB */
67 s->ptr_lastgob = s->pb.buf_ptr;
68 s->gob_number = 0;
69
70 put_bits(&s->pb, 22, 0x20); /* PSC */
66 put_bits(&s->pb, 8, ((s->picture_number * 30 * FRAME_RATE_BASE) / 71 put_bits(&s->pb, 8, ((s->picture_number * 30 * FRAME_RATE_BASE) /
67 s->frame_rate) & 0xff); 72 s->frame_rate) & 0xff);
68 73
69 put_bits(&s->pb, 1, 1); /* marker */ 74 put_bits(&s->pb, 1, 1); /* marker */
70 put_bits(&s->pb, 1, 0); /* h263 id */ 75 put_bits(&s->pb, 1, 0); /* h263 id */
149 if (s->rtp_mode) { 154 if (s->rtp_mode) {
150 pdif = s->pb.buf_ptr - s->ptr_lastgob; 155 pdif = s->pb.buf_ptr - s->ptr_lastgob;
151 if (pdif >= s->rtp_payload_size) { 156 if (pdif >= s->rtp_payload_size) {
152 /* Bad luck, packet must be cut before */ 157 /* Bad luck, packet must be cut before */
153 align_put_bits(&s->pb); 158 align_put_bits(&s->pb);
159 flush_put_bits(&s->pb);
160 /* Call the RTP callback to send the last GOB */
161 if (s->rtp_callback) {
162 pdif = s->pb.buf_ptr - s->ptr_lastgob;
163 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
164 }
154 s->ptr_lastgob = s->pb.buf_ptr; 165 s->ptr_lastgob = s->pb.buf_ptr;
155 put_bits(&s->pb, 17, 1); /* GBSC */ 166 put_bits(&s->pb, 17, 1); /* GBSC */
156 s->gob_number = mb_line; 167 s->gob_number = mb_line / s->gob_index;
157 put_bits(&s->pb, 5, s->gob_number); /* GN */ 168 put_bits(&s->pb, 5, s->gob_number); /* GN */
158 put_bits(&s->pb, 2, 1); /* GFID */ 169 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
159 put_bits(&s->pb, 5, s->qscale); /* GQUANT */ 170 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
171 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
160 return pdif; 172 return pdif;
161 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) { 173 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
162 /* Cut the packet before we can't */ 174 /* Cut the packet before we can't */
163 align_put_bits(&s->pb); 175 align_put_bits(&s->pb);
176 flush_put_bits(&s->pb);
177 /* Call the RTP callback to send the last GOB */
178 if (s->rtp_callback) {
179 pdif = s->pb.buf_ptr - s->ptr_lastgob;
180 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
181 }
164 s->ptr_lastgob = s->pb.buf_ptr; 182 s->ptr_lastgob = s->pb.buf_ptr;
165 put_bits(&s->pb, 17, 1); /* GBSC */ 183 put_bits(&s->pb, 17, 1); /* GBSC */
166 s->gob_number = mb_line; 184 s->gob_number = mb_line / s->gob_index;
167 put_bits(&s->pb, 5, s->gob_number); /* GN */ 185 put_bits(&s->pb, 5, s->gob_number); /* GN */
168 put_bits(&s->pb, 2, 1); /* GFID */ 186 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
169 put_bits(&s->pb, 5, s->qscale); /* GQUANT */ 187 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
188 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
170 return pdif; 189 return pdif;
171 } 190 }
172 } 191 }
173 return 0; 192 return 0;
174 } 193 }
411 int level, run, last, i, j, last_index, last_non_zero, sign, slevel; 430 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
412 int code; 431 int code;
413 RLTable *rl = &rl_inter; 432 RLTable *rl = &rl_inter;
414 433
415 if (s->mb_intra) { 434 if (s->mb_intra) {
416 /* DC coef */ 435 /* DC coef */
417 level = block[0]; 436 level = block[0];
418 /* 255 cannot be represented, so we clamp */ 437 /* 255 cannot be represented, so we clamp */
419 if (level > 254) { 438 if (level > 254) {
420 level = 254; 439 level = 254;
421 block[0] = 254; 440 block[0] = 254;
422 } 441 }
423 if (level == 128) 442 /* 0 cannot be represented also */
424 put_bits(&s->pb, 8, 0xff); 443 else if (!level) {
425 else 444 level = 1;
426 put_bits(&s->pb, 8, level & 0xff); 445 block[0] = 1;
427 i = 1; 446 }
428 } else { 447 if (level == 128)
429 i = 0; 448 put_bits(&s->pb, 8, 0xff);
449 else
450 put_bits(&s->pb, 8, level & 0xff);
451 i = 1;
452 } else {
453 i = 0;
430 } 454 }
431 455
432 /* AC coefs */ 456 /* AC coefs */
433 last_index = s->block_last_index[n]; 457 last_index = s->block_last_index[n];
434 last_non_zero = i - 1; 458 last_non_zero = i - 1;
1239 int format, width, height; 1263 int format, width, height;
1240 1264
1241 /* picture header */ 1265 /* picture header */
1242 if (get_bits(&s->gb, 22) != 0x20) 1266 if (get_bits(&s->gb, 22) != 0x20)
1243 return -1; 1267 return -1;
1244 skip_bits(&s->gb, 8); /* picture timestamp */ 1268 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
1245 1269
1246 if (get_bits1(&s->gb) != 1) 1270 if (get_bits1(&s->gb) != 1)
1247 return -1; /* marker */ 1271 return -1; /* marker */
1248 if (get_bits1(&s->gb) != 0) 1272 if (get_bits1(&s->gb) != 0)
1249 return -1; /* h263 id */ 1273 return -1; /* h263 id */
1250 skip_bits1(&s->gb); /* split screen off */ 1274 skip_bits1(&s->gb); /* split screen off */