comparison msmpeg4.c @ 5179:04bbac6e28df libavcodec

modify msmpeg4 functions to generate VC1 compatible block layer bitstream patch by Fortin Denis: \fortin nerim net/ original thread: [FFmpeg-devel] [PATCH] wmv3 encoder : msmpeg4.c changes date: 06/19/2007 09:54 PM
author benoit
date Fri, 22 Jun 2007 08:35:21 +0000
parents b215d5a5fa9a
children 470601203f44
comparison
equal deleted inserted replaced
5178:b215d5a5fa9a 5179:04bbac6e28df
781 #define DC_MAX 119 781 #define DC_MAX 119
782 782
783 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) 783 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
784 { 784 {
785 int sign, code; 785 int sign, code;
786 int pred; 786 int pred, extquant;
787 int extrabits = 0;
787 788
788 if(s->msmpeg4_version==1){ 789 if(s->msmpeg4_version==1){
789 int32_t *dc_val; 790 int32_t *dc_val;
790 pred = msmpeg4v1_pred_dc(s, n, &dc_val); 791 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
791 792
823 sign = 1; 824 sign = 1;
824 } 825 }
825 code = level; 826 code = level;
826 if (code > DC_MAX) 827 if (code > DC_MAX)
827 code = DC_MAX; 828 code = DC_MAX;
829 else if( s->msmpeg4_version>=6 ) {
830 if( s->qscale == 1 ) {
831 extquant = (level + 3) & 0x3;
832 code = ((level+3)>>2);
833 } else if( s->qscale == 2 ) {
834 extquant = (level + 1) & 0x1;
835 code = ((level+1)>>1);
836 }
837 }
828 838
829 if (s->dc_table_index == 0) { 839 if (s->dc_table_index == 0) {
830 if (n < 4) { 840 if (n < 4) {
831 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]); 841 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
832 } else { 842 } else {
838 } else { 848 } else {
839 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]); 849 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
840 } 850 }
841 } 851 }
842 852
853 if(s->msmpeg4_version>=6 && s->qscale<=2)
854 extrabits = 3 - s->qscale;
855
843 if (code == DC_MAX) 856 if (code == DC_MAX)
844 put_bits(&s->pb, 8, level); 857 put_bits(&s->pb, 8 + extrabits, level);
858 else if(extrabits > 0)//== VC1 && s->qscale<=2
859 put_bits(&s->pb, extrabits, extquant);
845 860
846 if (level != 0) { 861 if (level != 0) {
847 put_bits(&s->pb, 1, sign); 862 put_bits(&s->pb, 1, sign);
848 } 863 }
849 } 864 }
866 if (n < 4) { 881 if (n < 4) {
867 rl = &rl_table[s->rl_table_index]; 882 rl = &rl_table[s->rl_table_index];
868 } else { 883 } else {
869 rl = &rl_table[3 + s->rl_chroma_table_index]; 884 rl = &rl_table[3 + s->rl_chroma_table_index];
870 } 885 }
871 run_diff = 0; 886 run_diff = s->msmpeg4_version>=6;
872 scantable= s->intra_scantable.permutated; 887 scantable= s->intra_scantable.permutated;
873 } else { 888 } else {
874 i = 0; 889 i = 0;
875 rl = &rl_table[3 + s->rl_table_index]; 890 rl = &rl_table[3 + s->rl_table_index];
876 if(s->msmpeg4_version<=2) 891 if(s->msmpeg4_version<=2)
879 run_diff = 1; 894 run_diff = 1;
880 scantable= s->inter_scantable.permutated; 895 scantable= s->inter_scantable.permutated;
881 } 896 }
882 897
883 /* recalculate block_last_index for M$ wmv1 */ 898 /* recalculate block_last_index for M$ wmv1 */
884 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){ 899 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
885 for(last_index=63; last_index>=0; last_index--){ 900 for(last_index=63; last_index>=0; last_index--){
886 if(block[scantable[last_index]]) break; 901 if(block[scantable[last_index]]) break;
887 } 902 }
888 s->block_last_index[n]= last_index; 903 s->block_last_index[n]= last_index;
889 }else 904 }else
935 put_bits(&s->pb, 1, last); 950 put_bits(&s->pb, 1, last);
936 if(s->msmpeg4_version>=4){ 951 if(s->msmpeg4_version>=4){
937 if(s->esc3_level_length==0){ 952 if(s->esc3_level_length==0){
938 s->esc3_level_length=8; 953 s->esc3_level_length=8;
939 s->esc3_run_length= 6; 954 s->esc3_run_length= 6;
955 //ESCLVLSZ + ESCRUNSZ
940 if(s->qscale<8) 956 if(s->qscale<8)
941 put_bits(&s->pb, 6, 3); 957 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
942 else 958 else
943 put_bits(&s->pb, 8, 3); 959 put_bits(&s->pb, 8, 3);
944 } 960 }
945 put_bits(&s->pb, s->esc3_run_length, run); 961 put_bits(&s->pb, s->esc3_run_length, run);
946 put_bits(&s->pb, 1, sign); 962 put_bits(&s->pb, 1, sign);