Mercurial > libavcodec.hg
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 */ |