comparison h263.c @ 162:de80712db90b libavcodec

- Preliminary RTP friendly mode for H.263. - GOB headers for H.263 coding on RTP mode. - Improved GOB header detection for H.263 decoder.
author pulento
date Mon, 19 Nov 2001 02:13:14 +0000
parents 7ce36cf13055
children ac5075a55488
comparison
equal deleted inserted replaced
161:7ce36cf13055 162:de80712db90b
138 } 138 }
139 139
140 put_bits(&s->pb, 1, 0); /* no PEI */ 140 put_bits(&s->pb, 1, 0); /* no PEI */
141 } 141 }
142 142
143 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
144 {
145 int pdif=0;
146
147 /* Check to see if we need to put a new GBSC */
148 /* for RTP packetization */
149 if (s->rtp_mode) {
150 pdif = s->pb.buf_ptr - s->ptr_lastgob;
151 if (pdif >= s->rtp_payload_size) {
152 /* Bad luck, packet must be cut before */
153 align_put_bits(&s->pb);
154 s->ptr_lastgob = s->pb.buf_ptr;
155 put_bits(&s->pb, 17, 1); /* GBSC */
156 s->gob_number = mb_line;
157 put_bits(&s->pb, 5, s->gob_number); /* GN */
158 put_bits(&s->pb, 2, 1); /* GFID */
159 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
160 return pdif;
161 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
162 /* Cut the packet before we can't */
163 align_put_bits(&s->pb);
164 s->ptr_lastgob = s->pb.buf_ptr;
165 put_bits(&s->pb, 17, 1); /* GBSC */
166 s->gob_number = mb_line;
167 put_bits(&s->pb, 5, s->gob_number); /* GN */
168 put_bits(&s->pb, 2, 1); /* GFID */
169 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
170 return pdif;
171 }
172 }
173 return 0;
174 }
175
143 void h263_encode_mb(MpegEncContext * s, 176 void h263_encode_mb(MpegEncContext * s,
144 DCTELEM block[6][64], 177 DCTELEM block[6][64],
145 int motion_x, int motion_y) 178 int motion_x, int motion_y)
146 { 179 {
147 int cbpc, cbpy, i, cbp, pred_x, pred_y; 180 int cbpc, cbpy, i, cbp, pred_x, pred_y;
148 181
149 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); 182 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
150 if (!s->mb_intra) { 183 if (!s->mb_intra) {
151 /* compute cbp */ 184 /* compute cbp */
152 cbp = 0; 185 cbp = 0;
153 for (i = 0; i < 6; i++) { 186 for (i = 0; i < 6; i++) {
770 &DCtab_chrom[0][1], 2, 1, 803 &DCtab_chrom[0][1], 2, 1,
771 &DCtab_chrom[0][0], 2, 1); 804 &DCtab_chrom[0][0], 2, 1);
772 } 805 }
773 } 806 }
774 807
808 int h263_decode_gob_header(MpegEncContext *s)
809 {
810 unsigned int val, gfid;
811
812 /* Check for GOB Start Code */
813 val = show_bits(&s->gb, 16);
814 if (val == 0) {
815 /* We have a GBSC probably with GSTUFF */
816 skip_bits(&s->gb, 16); /* Drop the zeros */
817 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
818 #ifdef DEBUG
819 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
820 #endif
821 s->gob_number = get_bits(&s->gb, 5); /* GN */
822 gfid = get_bits(&s->gb, 2); /* GFID */
823 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
824 #ifdef DEBUG
825 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", gn, gfid, s->qscale);
826 #endif
827 return 1;
828 }
829 return 0;
830
831 }
832
775 int h263_decode_mb(MpegEncContext *s, 833 int h263_decode_mb(MpegEncContext *s,
776 DCTELEM block[6][64]) 834 DCTELEM block[6][64])
777 { 835 {
778 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; 836 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
779 unsigned int val;
780 INT16 *mot_val; 837 INT16 *mot_val;
781 static INT8 quant_tab[4] = { -1, -2, 1, 2 }; 838 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
782 unsigned int gfid;
783 839
784 /* Check for GOB Start Code */
785 if (s->mb_x == 0) {
786 val = show_bits(&s->gb, 16);
787 if (val == 0) {
788 /* We have a GBSC probably with GSTUFF */
789 skip_bits(&s->gb, 16); /* Drop the zeros */
790 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
791 #ifdef DEBUG
792 fprintf(stderr,"\nGOB Start Code at MB %d\n",
793 (s->mb_y * s->mb_width) + s->mb_x);
794 #endif
795 s->gob_number = get_bits(&s->gb, 5); /* GN */
796 gfid = get_bits(&s->gb, 2); /* GFID */
797 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
798 #ifdef DEBUG
799 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", gn, gfid, s->qscale);
800 #endif
801 }
802 }
803 /* FIXME: In the future H.263+ will have intra prediction */
804 /* and we are gonna need another way to detect MPEG4 */
805 if (!s->h263_pred) {
806 if (s->mb_y == s->gob_number)
807 s->first_gob_line = 1;
808 else
809 s->first_gob_line = 0;
810 }
811 if (s->pict_type == P_TYPE) { 840 if (s->pict_type == P_TYPE) {
812 if (get_bits1(&s->gb)) { 841 if (get_bits1(&s->gb)) {
813 /* skip mb */ 842 /* skip mb */
814 s->mb_intra = 0; 843 s->mb_intra = 0;
815 for(i=0;i<6;i++) 844 for(i=0;i<6;i++)