Mercurial > libavcodec.hg
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++) |