/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ /* * Disclaimer of Warranty * * These software programs are available to the user without any license fee or * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims * any and all warranties, whether express, implied, or statuary, including any * implied warranties or merchantability or of fitness for a particular * purpose. In no event shall the copyright-holder be liable for any * incidental, punitive, or consequential damages of any kind whatsoever * arising from the use of these programs. * * This disclaimer of warranty extends to the user of these programs and user's * customers, employees, agents, transferees, successors, and assigns. * * The MPEG Software Simulation Group does not represent or warrant that the * programs furnished hereunder are free of infringement of any third-party * patents. * * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, * are subject to royalty fees to patent holders. Many of these patents are * general enough such that they are unavoidable regardless of implementation * design. * */ /* * net.sourceforge.dvb.projectx.io.BitWalker * * Parts of MpvDecoder.java copied - especially to retrieve the picture_structure * from the PICTURE_CODING_EXTENSION of a picture. * And some other stuff in this context for further use. * * --- cminfo --- * * Created on 27.02.2006 by Arno * */ package net.sourceforge.dvb.projectx.io; public class BitWalker { private final int USER_DATA_START_CODE = 0x1B2; private final int EXTENSION_START_CODE = 0x1B5; /* extension start code IDs */ private final int PICTURE_CODING_EXTENSION_ID = 8; public static final int FRAME_PICTURE = 3; private int BitPos = 0; private int BufferPos = 0; private long StartPos = 0; private byte[] buf = new byte[0]; public BitWalker() { super(); } public BitWalker(byte[] inpBuf, int inpStartPos) { super(); setBuf(inpBuf, inpStartPos); } public void resetCounters() { BufferPos = (int) StartPos; BitPos = BufferPos << 3; } public void setStartPos(int inpStartPos) { StartPos = inpStartPos; resetCounters(); } public void setBuf(byte[] inpBuf, int inpStartPos) { buf = inpBuf; setStartPos(inpStartPos); } private void skipBits(int n) { BitPos += n; BufferPos = BitPos >>> 3; } private void Flush_Bits(int n) { skipBits(n); } private int showBits(int n) { int Pos = BitPos >>> 3; int Val = (0xFF & buf[Pos]) << 24 | (0xFF & buf[Pos + 1]) << 16 | (0xFF & buf[Pos + 2]) << 8 | (0xFF & buf[Pos + 3]); Val <<= BitPos & 7; Val >>>= 32 - n; return Val; } private int Show_Bits(int n) { return showBits(n); } private int popBits(int n) { int Val = showBits(n); BitPos += n; BufferPos = BitPos >>> 3; return Val; } private int Get_Bits(int n) { return popBits(n); } /* align to start of next next_start_code */ private void next_start_code() { skipBits((8 - (BitPos & 7)) & 7); while (showBits(24) != 1) skipBits(8); } // ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 private void user_data() { skipBits(32); while (popBits(24) != 0x000001) { skipBits(8); } } /* decode picture coding extension */ private int search_picture_structure() { // f_code:4[2][2]; // int intra_dc_precision:2 skipBits(18); int picture_structure = popBits(2); skipBits(8); int progressive_frame = popBits(1); if (progressive_frame == 1) { return FRAME_PICTURE; } return picture_structure; } /* decode extension and user data */ /* ISO/IEC 13818-2 section 6.2.2.2 */ private int find_picture_structure() { int code; next_start_code(); while ((code = showBits(32)) == EXTENSION_START_CODE || code == USER_DATA_START_CODE) { if (code == EXTENSION_START_CODE) { skipBits(32); int ext_ID = popBits(4); switch (ext_ID) { case PICTURE_CODING_EXTENSION_ID: return search_picture_structure(); } } else { user_data(); } next_start_code(); } return FRAME_PICTURE; // not found } public int getPictureStructure(boolean inpIsPicHd) { int tmpStruct = FRAME_PICTURE; try { resetCounters(); tmpStruct = find_picture_structure(); } catch (Exception e) { // maybe ArrayOutOfBounds // e.printStackTrace(); } return tmpStruct; } }