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