1
1
package sysu .ss .xu ;
2
2
3
+ import java .nio .ByteBuffer ;
4
+ import java .nio .ShortBuffer ;
5
+
3
6
import android .app .Activity ;
4
7
import android .content .Context ;
5
8
import android .graphics .Bitmap ;
@@ -24,110 +27,158 @@ public class PlayerActivity extends Activity {
24
27
public void onCreate (Bundle savedInstanceState ) {
25
28
super .onCreate (savedInstanceState );
26
29
27
-
30
+ // test();
31
+
32
+ DisplayMetrics dm = new DisplayMetrics ();
33
+ this .getWindowManager ().getDefaultDisplay ().getMetrics (dm );
34
+ setContentView (new PlayerView (this , dm .widthPixels , dm .heightPixels ));
28
35
29
- // TextView tv = new TextView(this);
30
- // setContentView(tv);
31
- //
32
- FFmpeg ff = new FFmpeg ();
36
+
37
+ }
38
+
39
+
40
+ private void test () {
41
+ FFmpeg ff = new FFmpeg ();
33
42
34
43
35
- ff .openFile ("/mnt/sdcard/ipod.m4v " );
44
+ ff .openFile ("/mnt/sdcard/mpeg2.m2v " );
36
45
int width = ff .getWidth ();
37
46
int height = ff .getHeight ();
38
47
int bitrate = ff .getBitRate ();
39
48
40
49
Log .i ("main" , "w " + width );
41
50
Log .i ("main" , "h " + height );
42
51
Log .i ("main" , "br " + bitrate );
52
+ int linesize = width * height ;
43
53
byte [] pixels = ff .getNextDecodedFrame ();
44
- Log .i ("main" , "" + pixels .length );
45
- Log .i ("main" , "0 " + pixels [0 ]);
46
- Log .i ("main" , "1 " + pixels [width * height ]);
47
- Log .i ("main" , "2 " + pixels [width * height * 2 ]);
48
-
49
-
50
-
51
-
52
-
53
-
54
- //setContentView(R.layout.main);
55
- // DisplayMetrics dm = new DisplayMetrics();
56
- // this.getWindowManager().getDefaultDisplay().getMetrics(dm);
57
- // setContentView(new PlayerView(this, dm.widthPixels, dm.heightPixels));
58
- // DisplayMetrics dm = new DisplayMetrics();
59
- // this.getWindowManager().getDefaultDisplay().getMetrics(dm);
60
- // gv = new GameView(this,dm.widthPixels,dm.heightPixels);
61
- // setContentView(gv);
62
- }
63
-
64
-
65
- class PlayerView extends View implements Runnable {
54
+ }
55
+
56
+
57
+ class PlayerView extends View implements Runnable {
66
58
67
59
private Bitmap bitmap ;
68
60
private Paint p ;
69
61
private FFmpeg ff ;
70
62
private int width ;
71
63
private int height ;
72
- private int bitrate ;
73
- private int [] framePixels ;
74
64
private int bitmapWidth ;
65
+ private byte [] nativePixels ;
66
+ private int [] pixels ;
67
+ private ByteBuffer buffer ;
75
68
76
69
77
70
public PlayerView (Context context , int DisplayWidth , int DisplayHeight ) {
78
71
super (context );
79
72
80
- bitmap = Bitmap .createBitmap (DisplayWidth , DisplayHeight , Bitmap .Config .RGB_565 );
81
73
//b = BitmapFactory.decodeResource(this.getResources(), R.drawable.qq);
82
74
p = new Paint ();
83
75
84
- Log .i ("pp" , "w: " + DisplayWidth + " h: " + DisplayHeight );
85
-
86
- bitmapWidth = bitmap .getWidth ();
87
- bitmap .setHasAlpha (true );
88
-
89
- byte r = 0 ; r <<= 3 ;
90
- byte g = (byte ) 255 ; g <<= 2 ;
91
- byte b = 0 ; b <<= 3 ;
92
- int pixelValue =Color .argb (255 , r , g , b );
93
- for (int j = 0 ; j < 30 ; j ++)
94
- {
95
- for (int i = 0 ; i < 30 ; i ++) {
96
- bitmap .setPixel (30 + i , 30 + j , pixelValue );
97
- }
98
- }
76
+ // testSetPixel();
99
77
100
78
ff = new FFmpeg ();
101
- ff .openFile ("/mnt/sdcard/ipod.m4v" );
79
+ ff .openFile ("/mnt/sdcard/mpeg2.m2v" );
80
+ //ff.openFile("/mnt/sdcard/a.mp4");
102
81
width = ff .getWidth ();
103
82
height = ff .getHeight ();
104
- bitrate = ff .getBitRate ();
105
83
106
- Log .i ("bm" , "w " + width );
107
- Log .i ("bm" , "h " + height );
108
- Log .i ("bm" , "br " + bitrate );
84
+ // bitmap = Bitmap.createBitmap(DisplayWidth, DisplayHeight, Bitmap.Config.RGB_565);
85
+ bitmap = Bitmap .createBitmap (width , height , Bitmap .Config .RGB_565 );
86
+
87
+ Log .i ("view" , "ff w " + width );
88
+ Log .i ("view" , "ff h " + height );
89
+
90
+ nativePixels = ff .getNextDecodedFrame ();
91
+ Log .i ("view" , "native.length " + nativePixels .length );
92
+ Log .i ("view" , "needed bytes of pixels " + (width * height * 2 ));
93
+
94
+ // buffer = ShortBuffer.allocate(width * height);
95
+ buffer = ByteBuffer .wrap (nativePixels );
96
+
97
+ // renderCopy();
98
+ // testRenderCopy();
99
+
100
+ bitmap .copyPixelsFromBuffer (buffer );
109
101
110
102
/* 开启线程 */
111
103
new Thread (this ).start ();
112
104
113
105
Log .i ("player view" , "constructor" );
114
- }
115
- public void onDraw (Canvas canvas ){
106
+ }
107
+
108
+ private void testRenderCopy () {
109
+ // TODO Auto-generated method stub
110
+ int rIndex , gIndex , bIndex ;
111
+ short temp ;
112
+ rIndex = 0 ;
113
+ gIndex = width * height ;
114
+ bIndex = width * height * 2 ;
115
+ temp = 0x0000 ;
116
+
117
+ Log .i ("test" , "native R " + Integer .toHexString (nativePixels [rIndex ]));
118
+ Log .i ("test" , "native G " + Integer .toHexString (nativePixels [gIndex ]));
119
+ Log .i ("test" , "native B " + Integer .toHexString (nativePixels [bIndex ]));
120
+
121
+ temp = (short ) (nativePixels [rIndex ] << 11 );
122
+ Log .i ("test" , Integer .toHexString (temp ));
123
+ temp = (short ) (temp | ((short ) (nativePixels [gIndex ] << 5 )));
124
+ Log .i ("test" , Integer .toHexString (temp ));
125
+ temp = (short ) (temp | ((short ) (nativePixels [bIndex ])));
126
+ Log .i ("test" , Integer .toHexString (temp ));
127
+ }
128
+
129
+ private void testSetPixel () {
130
+ bitmap .setHasAlpha (true );
131
+
132
+ byte r = 0 ; r <<= 3 ;
133
+ byte g = (byte ) 255 ; g <<= 2 ;
134
+ byte b = 0 ; b <<= 3 ;
135
+ int pixelValue =Color .argb (255 , r , g , b );
136
+ for (int j = 0 ; j < 30 ; j ++)
137
+ {
138
+ for (int i = 0 ; i < 30 ; i ++) {
139
+ bitmap .setPixel (30 + i , 30 + j , pixelValue );
140
+ }
141
+ }
142
+ }
143
+
144
+ public void onDraw (Canvas canvas ){
116
145
super .onDraw (canvas );
117
146
118
- canvas .drawColor (Color .RED );
147
+ canvas .drawColor (Color .GREEN );
119
148
120
- //framePixels = ff.getNextDecodedFrame();
121
- ff . getNextDecodedFrame ( );
122
- // bitmap.setPixels(framePixels, 0, bitmapWidth, 0, 0, width, height );
123
-
124
- // canvas.drawBitmap(bitmap, 0, 0, p);
149
+ nativePixels = ff .getNextDecodedFrame ();
150
+ buffer = ByteBuffer . wrap ( nativePixels );
151
+ bitmap .copyPixelsFromBuffer ( buffer );
152
+
153
+ canvas .drawBitmap (bitmap , 0 , 0 , p );
125
154
126
155
127
156
}
128
157
129
158
130
- public void run () {
159
+ private void renderCopy () {
160
+ //TODO
161
+ int rIndex , gIndex , bIndex ;
162
+ short temp ;
163
+ rIndex = 0 ;
164
+ gIndex = width * height ;
165
+ bIndex = width * height * 2 ;
166
+ temp = 0x0000 ;
167
+
168
+ buffer .rewind ();
169
+ for (int loop = 0 ; loop < buffer .capacity (); loop ++) {
170
+ temp = (short ) (nativePixels [rIndex ] << 11 );
171
+ temp = (short ) (temp | ((short ) (nativePixels [gIndex ] << 5 )));
172
+ temp = (short ) (temp | ((short ) (nativePixels [bIndex ])));
173
+ // buffer.put( temp );
174
+
175
+ ++rIndex ;
176
+ ++gIndex ;
177
+ ++bIndex ;
178
+ }
179
+ buffer .rewind ();
180
+ }
181
+ public void run () {
131
182
while (!Thread .currentThread ().isInterrupted ()) {
132
183
try {
133
184
Thread .sleep (100 );
0 commit comments