Dominic Szablewski před 11 roky
rodič
revize
858b16f3dc
1 změnil soubory, kde provedl 237 přidání a 237 odebrání
  1. 237 237
      jsmpg.js

+ 237 - 237
jsmpg.js Zobrazit soubor

@@ -38,8 +38,8 @@ var jsmpeg = window.jsmpeg = function( url, opts ) {
38 38
 	this.customIntraQuantMatrix = new Uint8Array(64);
39 39
 	this.customNonIntraQuantMatrix = new Uint8Array(64);
40 40
 	this.blockData = new Int32Array(64);
41
-  this.zeroBlockData = new Int32Array(64);
42
-  this.fillArray(this.zeroBlockData, 0);
41
+	this.zeroBlockData = new Int32Array(64);
42
+	this.fillArray(this.zeroBlockData, 0);
43 43
 
44 44
 	this.canvasContext = this.canvas.getContext('2d');
45 45
 
@@ -694,27 +694,27 @@ jsmpeg.prototype.YCbCrToRGBA = function() {
694 694
 			g = ((cb * 88) >> 8) - 44 + ((cr * 183) >> 8) - 91;
695 695
 			b = (cb + ((cb * 198) >> 8)) - 227;
696 696
 			
697
-      // Line 1
698
-      var y1 = pY[yIndex1++];
699
-      var y2 = pY[yIndex1++];
700
-      pRGBA[rgbaIndex1]   = y1 + r;
701
-      pRGBA[rgbaIndex1+1] = y1 - g;
702
-      pRGBA[rgbaIndex1+2] = y1 + b;      
703
-      pRGBA[rgbaIndex1+4] = y2 + r;
704
-      pRGBA[rgbaIndex1+5] = y2 - g;
705
-      pRGBA[rgbaIndex1+6] = y2 + b;
706
-      rgbaIndex1 += 8;
707
-      
708
-      // Line 2
709
-      var y3 = pY[yIndex2++];
710
-      var y4 = pY[yIndex2++];
711
-      pRGBA[rgbaIndex2]   = y3 + r;
712
-      pRGBA[rgbaIndex2+1] = y3 - g;
713
-      pRGBA[rgbaIndex2+2] = y3 + b;      
714
-      pRGBA[rgbaIndex2+4] = y4 + r;
715
-      pRGBA[rgbaIndex2+5] = y4 - g;
716
-      pRGBA[rgbaIndex2+6] = y4 + b;
717
-      rgbaIndex2 += 8;
697
+			// Line 1
698
+			var y1 = pY[yIndex1++];
699
+			var y2 = pY[yIndex1++];
700
+			pRGBA[rgbaIndex1]   = y1 + r;
701
+			pRGBA[rgbaIndex1+1] = y1 - g;
702
+			pRGBA[rgbaIndex1+2] = y1 + b;
703
+			pRGBA[rgbaIndex1+4] = y2 + r;
704
+			pRGBA[rgbaIndex1+5] = y2 - g;
705
+			pRGBA[rgbaIndex1+6] = y2 + b;
706
+			rgbaIndex1 += 8;
707
+
708
+			// Line 2
709
+			var y3 = pY[yIndex2++];
710
+			var y4 = pY[yIndex2++];
711
+			pRGBA[rgbaIndex2]   = y3 + r;
712
+			pRGBA[rgbaIndex2+1] = y3 - g;
713
+			pRGBA[rgbaIndex2+2] = y3 + b;
714
+			pRGBA[rgbaIndex2+4] = y4 + r;
715
+			pRGBA[rgbaIndex2+5] = y4 - g;
716
+			pRGBA[rgbaIndex2+6] = y4 + b;
717
+			rgbaIndex2 += 8;
718 718
 		}
719 719
 		
720 720
 		yIndex1 += yNext2Lines;
@@ -1204,232 +1204,232 @@ jsmpeg.prototype.dcPredictorCb;
1204 1204
 jsmpeg.prototype.blockData = null;
1205 1205
 jsmpeg.prototype.decodeBlock = function(block) {
1206 1206
 	
1207
-  var
1208
-    n = 0,
1209
-    quantMatrix;
1210
-    
1211
-  // Decode DC coefficient of intra-coded blocks
1212
-  if( this.macroblockIntra ) {
1213
-    var 
1214
-      predictor,
1215
-      dctSize;
1216
-    
1217
-    // DC prediction
1218
-    
1219
-    if( block < 4 ) {
1220
-      predictor = this.dcPredictorY;
1221
-      dctSize = this.readCode(DCT_DC_SIZE_LUMINANCE);
1222
-    }
1223
-    else {
1224
-      predictor = (block == 4 ? this.dcPredictorCr : this.dcPredictorCb);
1225
-      dctSize = this.readCode(DCT_DC_SIZE_CHROMINANCE);
1226
-    }
1227
-    
1228
-    // Read DC coeff
1229
-    if( dctSize > 0 ) {
1230
-      var differential = this.buffer.getBits(dctSize);
1231
-      if( (differential & (1 << (dctSize - 1))) != 0 ) {
1232
-        this.blockData[0] = predictor + differential;
1233
-      }
1234
-      else {
1235
-        this.blockData[0] = predictor + ((-1 << dctSize)|(differential+1));
1236
-      }
1237
-    }
1238
-    else {
1239
-      this.blockData[0] = predictor;
1240
-    }
1241
-    
1242
-    // Save predictor value
1243
-    if( block < 4 ) {
1244
-      this.dcPredictorY = this.blockData[0];
1245
-    }
1246
-    else if( block == 4 ) {
1247
-      this.dcPredictorCr = this.blockData[0];
1248
-    }
1249
-    else {
1250
-      this.dcPredictorCb = this.blockData[0];
1251
-    }
1252
-    
1253
-    // Dequantize + premultiply
1254
-    this.blockData[0] <<= (3 + 5);
1255
-    
1256
-    quantMatrix = this.intraQuantMatrix;
1257
-    n = 1;
1258
-  }
1259
-  else {
1260
-    quantMatrix = this.nonIntraQuantMatrix;
1261
-  }
1262
-  
1263
-  // Decode AC coefficients (+DC for non-intra)
1264
-  var level = 0;
1265
-  while( true ) {
1266
-    var 
1267
-      run = 0,
1268
-      coeff = this.readCode(DCT_COEFF);
1269
-    
1270
-    if( (coeff == 0x0001) && (n > 0) && (this.buffer.getBits(1) == 0) ) {
1271
-      // end_of_block
1272
-      break;
1273
-    }
1274
-    if( coeff == 0xffff ) {
1275
-      // escape
1276
-      run = this.buffer.getBits(6);
1277
-      level = this.buffer.getBits(8);
1278
-      if( level == 0 ) {
1279
-        level = this.buffer.getBits(8);
1280
-      }
1281
-      else if( level == 128 ) {
1282
-        level = this.buffer.getBits(8) - 256;
1283
-      }
1284
-      else if( level > 128 ) {
1285
-        level = level - 256;
1286
-      }
1287
-    }
1288
-    else {
1289
-      run = coeff >> 8;
1290
-      level = coeff & 0xff;
1291
-      if( this.buffer.getBits(1) ) {
1292
-        level = -level;
1293
-      }
1294
-    }
1295
-    
1296
-    n += run;
1297
-    var dezigZagged = ZIG_ZAG[n];
1298
-    n++;
1299
-    
1300
-    // Dequantize, oddify, clip
1301
-    level <<= 1;
1302
-    if( !this.macroblockIntra ) {
1303
-      level += (level < 0 ? -1 : 1);
1304
-    }
1305
-    level = (level * this.quantizerScale * quantMatrix[dezigZagged]) >> 4;
1306
-    if( (level & 1) == 0 ) {
1307
-      level -= level > 0 ? 1 : -1;
1308
-    }
1309
-    if( level > 2047 ) {
1310
-      level = 2047;
1311
-    }
1312
-    else if( level < -2048 ) {
1313
-      level = -2048;
1314
-    }
1315
-
1316
-    // Save premultiplied coefficient
1317
-    this.blockData[dezigZagged] = level * PREMULTIPLIER_MATRIX[dezigZagged];
1318
-  };
1319
-  
1320
-  // Move block to its place
1321
-  var
1322
-    destArray,
1323
-    destIndex,
1324
-    scan;
1325
-  
1326
-  if( block < 4 ) {
1327
-    destArray = this.currentY;
1328
-    scan = this.codedWidth - 8;
1329
-    destIndex = (this.mbRow * this.codedWidth + this.mbCol) << 4;
1330
-    if( (block & 1) != 0 ) {
1331
-      destIndex += 8;
1332
-    }
1333
-    if( (block & 2) != 0 ) {
1334
-      destIndex += this.codedWidth << 3;
1335
-    }
1336
-  }
1337
-  else {
1338
-    destArray = (block == 4) ? this.currentCb : this.currentCr;
1339
-    scan = (this.codedWidth >> 1) - 8;
1340
-    destIndex = ((this.mbRow * this.codedWidth) << 2) + (this.mbCol << 3);
1341
-  }
1342
-
1343
-  if( this.macroblockIntra ) {
1344
-    // Overwrite (no prediction)
1345
-    if (n == 1) {
1346
-      this.copyValueToDestination((this.blockData[0] + 128) >> 8, destArray, destIndex, scan);
1347
-      this.blockData[0] = 0;
1348
-    } else {
1349
-      this.IDCT();
1350
-      this.copyBlockToDestination(this.blockData, destArray, destIndex, scan);
1351
-      this.blockData.set(this.zeroBlockData);  
1352
-    }
1353
-  }
1354
-  else {
1355
-    // Add data to the predicted macroblock
1356
-    if (n == 1) {
1357
-      this.addValueToDestination((this.blockData[0] + 128) >> 8, destArray, destIndex, scan);
1358
-      this.blockData[0] = 0;
1359
-    } else {
1360
-      this.IDCT();
1361
-      this.addBlockToDestination(this.blockData, destArray, destIndex, scan);  
1362
-      this.blockData.set(this.zeroBlockData);  
1363
-    }
1364
-  }
1365
-  
1366
-  n = 0;
1207
+	var
1208
+		n = 0,
1209
+		quantMatrix;
1210
+		
1211
+	// Decode DC coefficient of intra-coded blocks
1212
+	if( this.macroblockIntra ) {
1213
+		var 
1214
+			predictor,
1215
+			dctSize;
1216
+		
1217
+		// DC prediction
1218
+		
1219
+		if( block < 4 ) {
1220
+			predictor = this.dcPredictorY;
1221
+			dctSize = this.readCode(DCT_DC_SIZE_LUMINANCE);
1222
+		}
1223
+		else {
1224
+			predictor = (block == 4 ? this.dcPredictorCr : this.dcPredictorCb);
1225
+			dctSize = this.readCode(DCT_DC_SIZE_CHROMINANCE);
1226
+		}
1227
+		
1228
+		// Read DC coeff
1229
+		if( dctSize > 0 ) {
1230
+			var differential = this.buffer.getBits(dctSize);
1231
+			if( (differential & (1 << (dctSize - 1))) != 0 ) {
1232
+				this.blockData[0] = predictor + differential;
1233
+			}
1234
+			else {
1235
+				this.blockData[0] = predictor + ((-1 << dctSize)|(differential+1));
1236
+			}
1237
+		}
1238
+		else {
1239
+			this.blockData[0] = predictor;
1240
+		}
1241
+		
1242
+		// Save predictor value
1243
+		if( block < 4 ) {
1244
+			this.dcPredictorY = this.blockData[0];
1245
+		}
1246
+		else if( block == 4 ) {
1247
+			this.dcPredictorCr = this.blockData[0];
1248
+		}
1249
+		else {
1250
+			this.dcPredictorCb = this.blockData[0];
1251
+		}
1252
+		
1253
+		// Dequantize + premultiply
1254
+		this.blockData[0] <<= (3 + 5);
1255
+		
1256
+		quantMatrix = this.intraQuantMatrix;
1257
+		n = 1;
1258
+	}
1259
+	else {
1260
+		quantMatrix = this.nonIntraQuantMatrix;
1261
+	}
1262
+	
1263
+	// Decode AC coefficients (+DC for non-intra)
1264
+	var level = 0;
1265
+	while( true ) {
1266
+		var 
1267
+			run = 0,
1268
+			coeff = this.readCode(DCT_COEFF);
1269
+		
1270
+		if( (coeff == 0x0001) && (n > 0) && (this.buffer.getBits(1) == 0) ) {
1271
+			// end_of_block
1272
+			break;
1273
+		}
1274
+		if( coeff == 0xffff ) {
1275
+			// escape
1276
+			run = this.buffer.getBits(6);
1277
+			level = this.buffer.getBits(8);
1278
+			if( level == 0 ) {
1279
+				level = this.buffer.getBits(8);
1280
+			}
1281
+			else if( level == 128 ) {
1282
+				level = this.buffer.getBits(8) - 256;
1283
+			}
1284
+			else if( level > 128 ) {
1285
+				level = level - 256;
1286
+			}
1287
+		}
1288
+		else {
1289
+			run = coeff >> 8;
1290
+			level = coeff & 0xff;
1291
+			if( this.buffer.getBits(1) ) {
1292
+				level = -level;
1293
+			}
1294
+		}
1295
+		
1296
+		n += run;
1297
+		var dezigZagged = ZIG_ZAG[n];
1298
+		n++;
1299
+		
1300
+		// Dequantize, oddify, clip
1301
+		level <<= 1;
1302
+		if( !this.macroblockIntra ) {
1303
+			level += (level < 0 ? -1 : 1);
1304
+		}
1305
+		level = (level * this.quantizerScale * quantMatrix[dezigZagged]) >> 4;
1306
+		if( (level & 1) == 0 ) {
1307
+			level -= level > 0 ? 1 : -1;
1308
+		}
1309
+		if( level > 2047 ) {
1310
+			level = 2047;
1311
+		}
1312
+		else if( level < -2048 ) {
1313
+			level = -2048;
1314
+		}
1315
+
1316
+		// Save premultiplied coefficient
1317
+		this.blockData[dezigZagged] = level * PREMULTIPLIER_MATRIX[dezigZagged];
1318
+	};
1319
+	
1320
+	// Move block to its place
1321
+	var
1322
+		destArray,
1323
+		destIndex,
1324
+		scan;
1325
+	
1326
+	if( block < 4 ) {
1327
+		destArray = this.currentY;
1328
+		scan = this.codedWidth - 8;
1329
+		destIndex = (this.mbRow * this.codedWidth + this.mbCol) << 4;
1330
+		if( (block & 1) != 0 ) {
1331
+			destIndex += 8;
1332
+		}
1333
+		if( (block & 2) != 0 ) {
1334
+			destIndex += this.codedWidth << 3;
1335
+		}
1336
+	}
1337
+	else {
1338
+		destArray = (block == 4) ? this.currentCb : this.currentCr;
1339
+		scan = (this.codedWidth >> 1) - 8;
1340
+		destIndex = ((this.mbRow * this.codedWidth) << 2) + (this.mbCol << 3);
1341
+	}
1342
+
1343
+	if( this.macroblockIntra ) {
1344
+		// Overwrite (no prediction)
1345
+		if (n == 1) {
1346
+			this.copyValueToDestination((this.blockData[0] + 128) >> 8, destArray, destIndex, scan);
1347
+			this.blockData[0] = 0;
1348
+		} else {
1349
+			this.IDCT();
1350
+			this.copyBlockToDestination(this.blockData, destArray, destIndex, scan);
1351
+			this.blockData.set(this.zeroBlockData);	
1352
+		}
1353
+	}
1354
+	else {
1355
+		// Add data to the predicted macroblock
1356
+		if (n == 1) {
1357
+			this.addValueToDestination((this.blockData[0] + 128) >> 8, destArray, destIndex, scan);
1358
+			this.blockData[0] = 0;
1359
+		} else {
1360
+			this.IDCT();
1361
+			this.addBlockToDestination(this.blockData, destArray, destIndex, scan);	
1362
+			this.blockData.set(this.zeroBlockData);	
1363
+		}
1364
+	}
1365
+	
1366
+	n = 0;
1367 1367
 };
1368 1368
 
1369 1369
 jsmpeg.prototype.copyBlockToDestination = function(_blockData, _destArray, _destIndex, scan) {
1370
-  var blockData = _blockData;
1371
-  var destArray = _destArray;
1372
-  var destIndex = _destIndex;
1373
-
1374
-  for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1375
-    destArray[destIndex+0] = blockData[n+0];
1376
-    destArray[destIndex+1] = blockData[n+1];
1377
-    destArray[destIndex+2] = blockData[n+2];
1378
-    destArray[destIndex+3] = blockData[n+3];
1379
-    destArray[destIndex+4] = blockData[n+4];
1380
-    destArray[destIndex+5] = blockData[n+5];
1381
-    destArray[destIndex+6] = blockData[n+6];
1382
-    destArray[destIndex+7] = blockData[n+7];
1383
-  }
1370
+	var blockData = _blockData;
1371
+	var destArray = _destArray;
1372
+	var destIndex = _destIndex;
1373
+
1374
+	for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1375
+		destArray[destIndex+0] = blockData[n+0];
1376
+		destArray[destIndex+1] = blockData[n+1];
1377
+		destArray[destIndex+2] = blockData[n+2];
1378
+		destArray[destIndex+3] = blockData[n+3];
1379
+		destArray[destIndex+4] = blockData[n+4];
1380
+		destArray[destIndex+5] = blockData[n+5];
1381
+		destArray[destIndex+6] = blockData[n+6];
1382
+		destArray[destIndex+7] = blockData[n+7];
1383
+	}
1384 1384
 };
1385 1385
 
1386 1386
 jsmpeg.prototype.addBlockToDestination = function(_blockData, _destArray, _destIndex, scan) {
1387
-  var blockData = _blockData;
1388
-  var destArray = _destArray;
1389
-  var destIndex = _destIndex;
1390
-
1391
-  for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1392
-    destArray[destIndex+0] += blockData[n+0];
1393
-    destArray[destIndex+1] += blockData[n+1];
1394
-    destArray[destIndex+2] += blockData[n+2];
1395
-    destArray[destIndex+3] += blockData[n+3];
1396
-    destArray[destIndex+4] += blockData[n+4];
1397
-    destArray[destIndex+5] += blockData[n+5];
1398
-    destArray[destIndex+6] += blockData[n+6];
1399
-    destArray[destIndex+7] += blockData[n+7];
1400
-  }
1387
+	var blockData = _blockData;
1388
+	var destArray = _destArray;
1389
+	var destIndex = _destIndex;
1390
+
1391
+	for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1392
+		destArray[destIndex+0] += blockData[n+0];
1393
+		destArray[destIndex+1] += blockData[n+1];
1394
+		destArray[destIndex+2] += blockData[n+2];
1395
+		destArray[destIndex+3] += blockData[n+3];
1396
+		destArray[destIndex+4] += blockData[n+4];
1397
+		destArray[destIndex+5] += blockData[n+5];
1398
+		destArray[destIndex+6] += blockData[n+6];
1399
+		destArray[destIndex+7] += blockData[n+7];
1400
+	}
1401 1401
 };
1402 1402
 
1403 1403
 jsmpeg.prototype.copyValueToDestination = function(value, _destArray, _destIndex, scan) {
1404
-  var destArray = _destArray;
1405
-  var destIndex = _destIndex;
1406
-
1407
-  for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1408
-    destArray[destIndex+0] = value;
1409
-    destArray[destIndex+1] = value;
1410
-    destArray[destIndex+2] = value;
1411
-    destArray[destIndex+3] = value;
1412
-    destArray[destIndex+4] = value;
1413
-    destArray[destIndex+5] = value;
1414
-    destArray[destIndex+6] = value;
1415
-    destArray[destIndex+7] = value;
1416
-  }
1404
+	var destArray = _destArray;
1405
+	var destIndex = _destIndex;
1406
+
1407
+	for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1408
+		destArray[destIndex+0] = value;
1409
+		destArray[destIndex+1] = value;
1410
+		destArray[destIndex+2] = value;
1411
+		destArray[destIndex+3] = value;
1412
+		destArray[destIndex+4] = value;
1413
+		destArray[destIndex+5] = value;
1414
+		destArray[destIndex+6] = value;
1415
+		destArray[destIndex+7] = value;
1416
+	}
1417 1417
 };
1418 1418
 
1419 1419
 jsmpeg.prototype.addValueToDestination = function(value, _destArray, _destIndex, scan) {
1420
-  var destArray = _destArray;
1421
-  var destIndex = _destIndex;
1422
-
1423
-  for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1424
-    destArray[destIndex+0] += value;
1425
-    destArray[destIndex+1] += value;
1426
-    destArray[destIndex+2] += value;
1427
-    destArray[destIndex+3] += value;
1428
-    destArray[destIndex+4] += value;
1429
-    destArray[destIndex+5] += value;
1430
-    destArray[destIndex+6] += value;
1431
-    destArray[destIndex+7] += value;
1432
-  }
1420
+	var destArray = _destArray;
1421
+	var destIndex = _destIndex;
1422
+
1423
+	for (var n = 0; n < 64; n += 8, destIndex += scan+8) {
1424
+		destArray[destIndex+0] += value;
1425
+		destArray[destIndex+1] += value;
1426
+		destArray[destIndex+2] += value;
1427
+		destArray[destIndex+3] += value;
1428
+		destArray[destIndex+4] += value;
1429
+		destArray[destIndex+5] += value;
1430
+		destArray[destIndex+6] += value;
1431
+		destArray[destIndex+7] += value;
1432
+	}
1433 1433
 };
1434 1434
 
1435 1435
 // Clamping version for shitty browsers (IE) that don't support Uint8ClampedArray