Changeset 128


Ignore:
Timestamp:
Jan 16, 2011, 4:31:02 PM (14 years ago)
Author:
george
Message:
  • Fixed: Bad QWord shifting.
  • Fixed: Reading dynamic value from bit stream.
Location:
CoolStreaming
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • CoolStreaming/Demo/DynNumber/DynNumberDemo.lpi

    r127 r128  
    3939      </Item2>
    4040    </RequiredPackages>
    41     <Units Count="15">
     41    <Units Count="16">
    4242      <Unit0>
    4343        <Filename Value="DynNumberDemo.lpr"/>
     
    4747        <TopLine Value="1"/>
    4848        <CursorPos X="41" Y="19"/>
    49         <UsageCount Value="39"/>
     49        <UsageCount Value="42"/>
    5050      </Unit0>
    5151      <Unit1>
     
    5858        <EditorIndex Value="0"/>
    5959        <WindowIndex Value="0"/>
    60         <TopLine Value="39"/>
    61         <CursorPos X="24" Y="53"/>
    62         <UsageCount Value="39"/>
     60        <TopLine Value="50"/>
     61        <CursorPos X="34" Y="61"/>
     62        <UsageCount Value="42"/>
    6363        <Loaded Value="True"/>
    6464        <LoadedDesigner Value="True"/>
     
    6767        <Filename Value="..\..\UDynNumber.pas"/>
    6868        <UnitName Value="UDynNumber"/>
    69         <EditorIndex Value="1"/>
    70         <WindowIndex Value="0"/>
    71         <TopLine Value="11"/>
    72         <CursorPos X="8" Y="14"/>
    73         <UsageCount Value="20"/>
     69        <EditorIndex Value="2"/>
     70        <WindowIndex Value="0"/>
     71        <TopLine Value="1"/>
     72        <CursorPos X="17" Y="10"/>
     73        <UsageCount Value="21"/>
    7474        <Loaded Value="True"/>
    7575      </Unit2>
     
    7979        <EditorIndex Value="4"/>
    8080        <WindowIndex Value="0"/>
    81         <TopLine Value="37"/>
    82         <CursorPos X="14" Y="53"/>
    83         <UsageCount Value="20"/>
     81        <TopLine Value="21"/>
     82        <CursorPos X="35" Y="29"/>
     83        <UsageCount Value="21"/>
    8484        <Loaded Value="True"/>
    8585      </Unit3>
     
    8787        <Filename Value="..\..\UBufferedFileStream.pas"/>
    8888        <UnitName Value="UBufferedFileStream"/>
    89         <EditorIndex Value="2"/>
    9089        <WindowIndex Value="0"/>
    9190        <TopLine Value="38"/>
    9291        <CursorPos X="30" Y="54"/>
    9392        <UsageCount Value="20"/>
    94         <Loaded Value="True"/>
    9593      </Unit4>
    9694      <Unit5>
     
    10098        <TopLine Value="773"/>
    10199        <CursorPos X="17" Y="789"/>
    102         <UsageCount Value="20"/>
     100        <UsageCount Value="21"/>
    103101        <Loaded Value="True"/>
    104102      </Unit5>
     
    168166        <UsageCount Value="11"/>
    169167      </Unit14>
     168      <Unit15>
     169        <Filename Value="..\..\..\..\..\lazarus\lcl\include\control.inc"/>
     170        <EditorIndex Value="1"/>
     171        <WindowIndex Value="0"/>
     172        <TopLine Value="2784"/>
     173        <CursorPos X="1" Y="2808"/>
     174        <UsageCount Value="10"/>
     175        <Loaded Value="True"/>
     176      </Unit15>
    170177    </Units>
    171178    <JumpHistory Count="30" HistoryIndex="29">
    172179      <Position1>
    173         <Filename Value="UMainForm.pas"/>
    174         <Caret Line="56" Column="1" TopLine="39"/>
     180        <Filename Value="..\..\UDynNumber.pas"/>
     181        <Caret Line="47" Column="1" TopLine="31"/>
    175182      </Position1>
    176183      <Position2>
    177184        <Filename Value="..\..\UDynNumber.pas"/>
    178         <Caret Line="31" Column="1" TopLine="21"/>
     185        <Caret Line="48" Column="1" TopLine="31"/>
    179186      </Position2>
    180187      <Position3>
    181188        <Filename Value="..\..\UDynNumber.pas"/>
    182         <Caret Line="32" Column="1" TopLine="21"/>
     189        <Caret Line="49" Column="1" TopLine="31"/>
    183190      </Position3>
    184191      <Position4>
    185192        <Filename Value="..\..\UDynNumber.pas"/>
    186         <Caret Line="33" Column="1" TopLine="21"/>
     193        <Caret Line="60" Column="1" TopLine="43"/>
    187194      </Position4>
    188195      <Position5>
    189196        <Filename Value="..\..\UDynNumber.pas"/>
    190         <Caret Line="34" Column="1" TopLine="21"/>
     197        <Caret Line="61" Column="1" TopLine="43"/>
    191198      </Position5>
    192199      <Position6>
    193200        <Filename Value="..\..\UDynNumber.pas"/>
    194         <Caret Line="31" Column="1" TopLine="21"/>
     201        <Caret Line="62" Column="1" TopLine="43"/>
    195202      </Position6>
    196203      <Position7>
    197204        <Filename Value="..\..\UDynNumber.pas"/>
    198         <Caret Line="32" Column="1" TopLine="21"/>
     205        <Caret Line="64" Column="1" TopLine="43"/>
    199206      </Position7>
    200207      <Position8>
    201208        <Filename Value="..\..\UDynNumber.pas"/>
    202         <Caret Line="35" Column="1" TopLine="21"/>
     209        <Caret Line="65" Column="1" TopLine="43"/>
    203210      </Position8>
    204211      <Position9>
    205212        <Filename Value="..\..\UDynNumber.pas"/>
    206         <Caret Line="36" Column="1" TopLine="21"/>
     213        <Caret Line="66" Column="1" TopLine="43"/>
    207214      </Position9>
    208215      <Position10>
    209216        <Filename Value="..\..\UDynNumber.pas"/>
    210         <Caret Line="37" Column="1" TopLine="21"/>
     217        <Caret Line="67" Column="1" TopLine="43"/>
    211218      </Position10>
    212219      <Position11>
    213220        <Filename Value="..\..\UDynNumber.pas"/>
    214         <Caret Line="38" Column="1" TopLine="21"/>
     221        <Caret Line="50" Column="1" TopLine="43"/>
    215222      </Position11>
    216223      <Position12>
    217224        <Filename Value="..\..\UDynNumber.pas"/>
    218         <Caret Line="36" Column="1" TopLine="21"/>
     225        <Caret Line="51" Column="1" TopLine="43"/>
    219226      </Position12>
    220227      <Position13>
    221228        <Filename Value="..\..\UDynNumber.pas"/>
    222         <Caret Line="37" Column="1" TopLine="21"/>
     229        <Caret Line="52" Column="1" TopLine="43"/>
    223230      </Position13>
    224231      <Position14>
    225         <Filename Value="..\..\UBitStream.pas"/>
    226         <Caret Line="164" Column="1" TopLine="149"/>
     232        <Filename Value="..\..\UDynNumber.pas"/>
     233        <Caret Line="53" Column="2" TopLine="40"/>
    227234      </Position14>
    228235      <Position15>
    229         <Filename Value="..\..\UBitStream.pas"/>
    230         <Caret Line="246" Column="1" TopLine="230"/>
     236        <Filename Value="..\..\UDynNumber.pas"/>
     237        <Caret Line="47" Column="1" TopLine="40"/>
    231238      </Position15>
    232239      <Position16>
    233         <Filename Value="..\..\UBitStream.pas"/>
    234         <Caret Line="249" Column="1" TopLine="230"/>
     240        <Filename Value="..\..\UDynNumber.pas"/>
     241        <Caret Line="48" Column="1" TopLine="40"/>
    235242      </Position16>
    236243      <Position17>
    237         <Filename Value="..\..\UBitStream.pas"/>
    238         <Caret Line="250" Column="1" TopLine="230"/>
     244        <Filename Value="..\..\UDynNumber.pas"/>
     245        <Caret Line="49" Column="1" TopLine="40"/>
    239246      </Position17>
    240247      <Position18>
    241         <Filename Value="..\..\UBitStream.pas"/>
    242         <Caret Line="251" Column="1" TopLine="230"/>
     248        <Filename Value="..\..\UDynNumber.pas"/>
     249        <Caret Line="60" Column="1" TopLine="40"/>
    243250      </Position18>
    244251      <Position19>
    245         <Filename Value="..\..\UBitStream.pas"/>
    246         <Caret Line="252" Column="1" TopLine="230"/>
     252        <Filename Value="..\..\UDynNumber.pas"/>
     253        <Caret Line="61" Column="1" TopLine="40"/>
    247254      </Position19>
    248255      <Position20>
    249         <Filename Value="..\..\UBitStream.pas"/>
    250         <Caret Line="253" Column="1" TopLine="230"/>
     256        <Filename Value="..\..\UDynNumber.pas"/>
     257        <Caret Line="62" Column="1" TopLine="40"/>
    251258      </Position20>
    252259      <Position21>
    253         <Filename Value="..\..\UBitStream.pas"/>
    254         <Caret Line="254" Column="1" TopLine="230"/>
     260        <Filename Value="..\..\UDynNumber.pas"/>
     261        <Caret Line="64" Column="1" TopLine="40"/>
    255262      </Position21>
    256263      <Position22>
    257         <Filename Value="..\..\UBitStream.pas"/>
    258         <Caret Line="255" Column="1" TopLine="230"/>
     264        <Filename Value="..\..\UDynNumber.pas"/>
     265        <Caret Line="65" Column="1" TopLine="40"/>
    259266      </Position22>
    260267      <Position23>
    261         <Filename Value="..\..\UBitStream.pas"/>
    262         <Caret Line="257" Column="1" TopLine="230"/>
     268        <Filename Value="..\..\UDynNumber.pas"/>
     269        <Caret Line="66" Column="1" TopLine="40"/>
    263270      </Position23>
    264271      <Position24>
    265         <Filename Value="..\..\UBitStream.pas"/>
    266         <Caret Line="258" Column="1" TopLine="231"/>
     272        <Filename Value="..\..\UDynNumber.pas"/>
     273        <Caret Line="67" Column="1" TopLine="40"/>
    267274      </Position24>
    268275      <Position25>
    269         <Filename Value="..\..\UBitStream.pas"/>
    270         <Caret Line="241" Column="1" TopLine="231"/>
     276        <Filename Value="..\..\UDynNumber.pas"/>
     277        <Caret Line="50" Column="1" TopLine="40"/>
    271278      </Position25>
    272279      <Position26>
    273         <Filename Value="..\..\UBitStream.pas"/>
    274         <Caret Line="242" Column="1" TopLine="231"/>
     280        <Filename Value="..\..\UDynNumber.pas"/>
     281        <Caret Line="51" Column="1" TopLine="40"/>
    275282      </Position26>
    276283      <Position27>
    277         <Filename Value="..\..\UBitStream.pas"/>
    278         <Caret Line="243" Column="1" TopLine="231"/>
     284        <Filename Value="..\..\UDynNumber.pas"/>
     285        <Caret Line="65" Column="30" TopLine="39"/>
    279286      </Position27>
    280287      <Position28>
    281288        <Filename Value="..\..\UBitStream.pas"/>
    282         <Caret Line="193" Column="1" TopLine="177"/>
     289        <Caret Line="162" Column="5" TopLine="150"/>
    283290      </Position28>
    284291      <Position29>
    285292        <Filename Value="..\..\UBitStream.pas"/>
    286         <Caret Line="194" Column="1" TopLine="177"/>
     293        <Caret Line="163" Column="31" TopLine="150"/>
    287294      </Position29>
    288295      <Position30>
    289296        <Filename Value="..\..\UBitStream.pas"/>
    290         <Caret Line="53" Column="14" TopLine="37"/>
     297        <Caret Line="161" Column="14" TopLine="146"/>
    291298      </Position30>
    292299    </JumpHistory>
  • CoolStreaming/Demo/DynNumber/UMainForm.lfm

    r126 r128  
    33  Height = 495
    44  Top = 114
    5   Width = 550
     5  Width = 669
    66  Caption = 'DynNumber Demo'
    77  ClientHeight = 495
    8   ClientWidth = 550
     8  ClientWidth = 669
    99  OnCreate = FormCreate
    1010  OnDestroy = FormDestroy
    1111  LCLVersion = '0.9.31'
    12   object Edit1: TEdit
     12  object PageControl1: TPageControl
    1313    Left = 8
     14    Height = 480
     15    Top = 8
     16    Width = 656
     17    ActivePage = TabSheet2
     18    Anchors = [akTop, akLeft, akRight, akBottom]
     19    TabIndex = 1
     20    TabOrder = 0
     21    object TabSheet1: TTabSheet
     22      Caption = 'Generator'
     23      ClientHeight = 449
     24      ClientWidth = 652
     25      object Button1: TButton
     26        Left = 11
     27        Height = 25
     28        Top = 10
     29        Width = 75
     30        Caption = 'Generate'
     31        OnClick = Button1Click
     32        TabOrder = 0
     33      end
     34      object Button2: TButton
     35        Left = 374
     36        Height = 25
     37        Top = 11
     38        Width = 75
     39        Caption = 'test'
     40        OnClick = Button2Click
     41        TabOrder = 1
     42      end
     43      object SpinEdit1: TSpinEdit
     44        Left = 99
     45        Height = 25
     46        Top = 10
     47        Width = 106
     48        MaxValue = 100000000
     49        TabOrder = 2
     50        Value = 10000
     51      end
     52      object ListView1: TListView
     53        Left = 11
     54        Height = 400
     55        Top = 43
     56        Width = 635
     57        Anchors = [akTop, akLeft, akRight, akBottom]
     58        Columns = <       
     59          item
     60            Caption = 'Number'
     61            Width = 70
     62          end       
     63          item
     64            Caption = 'Overhead'
     65            Width = 70
     66          end       
     67          item
     68            Caption = 'Value'
     69            Width = 494
     70          end>
     71        TabOrder = 3
     72        ViewStyle = vsReport
     73      end
     74    end
     75    object TabSheet2: TTabSheet
     76      Caption = 'Encoder'
     77      ClientHeight = 449
     78      ClientWidth = 652
     79      object Edit1: TEdit
     80        Left = 8
     81        Height = 25
     82        Top = 8
     83        Width = 638
     84        Anchors = [akTop, akLeft, akRight]
     85        TabOrder = 0
     86        Text = '1'
     87      end
     88      object Button3: TButton
     89        Left = 8
     90        Height = 25
     91        Top = 42
     92        Width = 142
     93        Caption = 'Encode'
     94        OnClick = Button3Click
     95        TabOrder = 1
     96      end
     97      object Edit2: TEdit
     98        Left = 6
     99        Height = 25
     100        Top = 75
     101        Width = 638
     102        Anchors = [akTop, akLeft, akRight]
     103        TabOrder = 2
     104        Text = '1'
     105      end
     106      object Button4: TButton
     107        Left = 8
     108        Height = 25
     109        Top = 107
     110        Width = 142
     111        Caption = 'Decode'
     112        OnClick = Button4Click
     113        TabOrder = 3
     114      end
     115    end
     116  end
     117  object Edit3: TEdit
     118    Left = 16
    14119    Height = 25
    15     Top = 8
    16     Width = 320
    17     TabOrder = 0
     120    Top = 176
     121    Width = 638
     122    Anchors = [akTop, akLeft, akRight]
     123    TabOrder = 1
    18124    Text = '1'
    19125  end
    20   object Button1: TButton
    21     Left = 336
    22     Height = 25
    23     Top = 5
    24     Width = 75
    25     Caption = 'Encode'
    26     OnClick = Button1Click
    27     TabOrder = 1
    28   end
    29   object Button2: TButton
    30     Left = 416
    31     Height = 25
    32     Top = 7
    33     Width = 75
    34     Caption = 'Generate'
    35     OnClick = Button2Click
    36     TabOrder = 2
    37   end
    38   object ListView1: TListView
    39     Left = 8
    40     Height = 448
    41     Top = 40
    42     Width = 536
    43     Anchors = [akTop, akLeft, akRight, akBottom]
    44     Columns = <   
    45       item
    46         Caption = 'Number'
    47         Width = 70
    48       end   
    49       item
    50         Caption = 'Overhead'
    51         Width = 70
    52       end   
    53       item
    54         Caption = 'Value'
    55         Width = 375
    56       end>
    57     TabOrder = 3
    58     ViewStyle = vsReport
    59   end
    60126end
  • CoolStreaming/Demo/DynNumber/UMainForm.pas

    r127 r128  
    77uses
    88  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    9   ComCtrls, UDynNumber, Math;
     9  ComCtrls, Spin, UDynNumber, Math;
    1010
    1111type
     
    1616    Button1: TButton;
    1717    Button2: TButton;
     18    Button3: TButton;
     19    Button4: TButton;
    1820    Edit1: TEdit;
     21    Edit2: TEdit;
     22    Edit3: TEdit;
    1923    ListView1: TListView;
     24    PageControl1: TPageControl;
     25    SpinEdit1: TSpinEdit;
     26    TabSheet1: TTabSheet;
     27    TabSheet2: TTabSheet;
    2028    procedure Button1Click(Sender: TObject);
    2129    procedure Button2Click(Sender: TObject);
     30    procedure Button3Click(Sender: TObject);
     31    procedure Button4Click(Sender: TObject);
    2232    procedure FormCreate(Sender: TObject);
    2333    procedure FormDestroy(Sender: TObject);
    2434  private
    25     { private declarations }
    2635  public
    2736    DynamicNumber: TDynamicNumber;
     
    4453  Parts: array of Integer;
    4554  N: TDynamicNumber;
    46   Line: string;
    4755  NewItem: TListItem;
    4856begin
     
    5159    ListView1.BeginUpdate;
    5260    ListView1.Clear;
    53     for I := 0 to 10000 do begin
     61    for I := 0 to SpinEdit1.Value do begin
    5462      N.Stream.Size := 0;
    55       N.Write(I);
    56       Line := '';
    57       N.Stream.Position := 0;
    58       for J := 0 to N.Stream.Size - 1 do
    59         Line := Line + IntToStr(Integer(N.Stream.ReadBit));
     63      N.WriteNumber(I);
    6064      NewItem := ListView1.Items.Add;
    6165      NewItem.Caption := IntToStr(I);
    6266      J := Floor(Log2(I)) + 1;
    6367      NewItem.SubItems.Add(FloatToStr(Round((1 - (J / N.Stream.Size)) * 100) / 100));
    64       NewItem.SubItems.Add(Line);
     68      NewItem.SubItems.Add(N.Stream.AsString);
    6569    end;
    6670  finally
     
    7983  MaxValue: Integer;
    8084  J: Integer;
    81   Line: string;
    8285  NewItem: TListItem;
    8386  N: TDynamicNumber;
     
    9194    ListView1.BeginUpdate;
    9295    ListView1.Clear;
    93     for II := 0 to 20000 do begin
     96    for II := 0 to SpinEdit1.Value do begin
    9497      I := II * Step;
    9598    // Write
     
    109112    J := Floor(Log2(I)) + 1;
    110113    NewItem.SubItems.Add(FloatToStr(Round((1 - (J / N.Stream.Size)) * 100) / 100));
    111     Line := '';
    112     N.Stream.Position := 0;
    113     for J := 0 to N.Stream.Size - 1 do
    114       Line := Line + IntToStr(Integer(N.Stream.ReadBit));
    115     NewItem.SubItems.Add(Line);
     114    NewItem.SubItems.Add(N.Stream.AsString);
    116115
    117116    // Increment value
     
    142141end;
    143142
     143procedure TMainForm.Button3Click(Sender: TObject);
     144var
     145  N: TDynamicNumber;
     146begin
     147  try
     148    N := TDynamicNumber.Create;
     149    N.Stream.Size := 0;
     150    N.WriteNumber(StrToInt64(Edit1.Text));
     151    N.Stream.Position := 0;
     152    Edit2.Text := N.Stream.AsString;
     153  finally
     154    N.Free;
     155  end;
     156end;
     157
     158procedure TMainForm.Button4Click(Sender: TObject);
     159var
     160  N: TDynamicNumber;
     161begin
     162  try
     163    N := TDynamicNumber.Create;
     164    N.Stream.AsString := Edit2.Text;
     165    Edit3.Text := IntToStr(N.ReadNumber);
     166  finally
     167    N.Free;
     168  end;
     169end;
     170
    144171procedure TMainForm.FormCreate(Sender: TObject);
    145172begin
  • CoolStreaming/UBitStream.pas

    r126 r128  
    2828    function CopyFrom(Source: TBitStream; Count: LongInt): LongInt;
    2929    function Write(const Buffer; Count: Longint): Longint; virtual;
     30    function GetString: string;
     31    procedure SetString(const AValue: string);
    3032    procedure ReadBuffer(var Buffer; Count: Longint);
    3133    procedure WriteBuffer(const Buffer; Count: Longint);
     
    3840    function ReadNumber(Count: Byte): QWord;
    3941    procedure WriteNumber(AValue: QWord; Count: Byte);
     42    property AsString: string read GetString write SetString;
    4043  end;
    4144
     
    158161begin
    159162  Read(Result, Count);
     163  Result := Result and ((QWord(1) shl Count) - 1);
    160164end;
    161165
     
    163167begin
    164168  Write(AValue, Count);
     169end;
     170
     171function TBitStream.GetString: string;
     172var
     173  I: Integer;
     174begin
     175  Result := '';
     176  Position := 0;
     177  for I := 0 to Size - 1 do
     178    Result := Result + IntToStr(Integer(ReadBit));
     179end;
     180
     181procedure TBitStream.SetString(const AValue: string);
     182var
     183  I: Integer;
     184begin
     185  Size := 0;
     186  for I := 1 to Length(AValue) do
     187    WriteBit(Boolean(StrToInt(AValue[I])));
     188  Position := 0;
    165189end;
    166190
     
    204228  Data: Byte;
    205229begin
    206   if Count < 0 then
     230  if (Count < 0) or (Count > (Size - Position)) then
    207231    raise EReadError.Create(SReadError);
    208232
  • CoolStreaming/UDynNumber.pas

    r127 r128  
    1414  TDynamicNumber = class
    1515    Stream: TBitStream;
    16     procedure Write(Value: QWord);
    17     function Read: QWord;
     16    procedure WriteNumber(Value: QWord);
     17    function ReadNumber: QWord;
    1818    constructor Create;
    1919    destructor Destroy; override;
     20  private
     21    function ReadNumber2: QWord;
    2022  end;
    2123
     
    2426{ TDynamicNumber }
    2527
    26 procedure TDynamicNumber.Write(Value: QWord);
     28procedure TDynamicNumber.WriteNumber(Value: QWord);
    2729var
    28   Bit: Byte;
    2930  Length: Integer;
    3031begin
     
    3233  if Length > 1 then begin
    3334    Stream.WriteNumber(1, 1);
    34     Write(Length - 2);
     35    WriteNumber(Length - 2);
    3536  end else Stream.WriteNumber(0, 1);
    3637  if Length > 1 then Length := Length - 1;
     
    3839end;
    3940
    40 function TDynamicNumber.Read: QWord;
     41function TDynamicNumber.ReadNumber: QWord;
    4142var
    4243  Bit: Byte;
    4344  Length: Integer;
    4445begin
     46  Length := 0;
    4547  Bit := Stream.ReadNumber(1);
    4648  if Bit = 0 then Length := 1
    47     else Length := Read + 2;
    48   Result := Stream.ReadNumber(Length);
    49   if Length > 0 then Result := Result or (1 shl Length);
     49    else Length := ReadNumber2 + 2;
     50  if Length > 1 then Result := Stream.ReadNumber(Length - 1)
     51    else Result := Stream.ReadNumber(Length);
     52  if Length > 1 then Result := Result or (QWord(1) shl (Length - 1));
     53end;
     54
     55function TDynamicNumber.ReadNumber2: QWord;
     56var
     57  Bit: Byte;
     58  Length: Integer;
     59begin
     60  Length := 0;
     61  Bit := Stream.ReadNumber(1);
     62  if Bit = 0 then Length := 1
     63    else Length := ReadNumber + 2;
     64  if Length > 1 then Result := Stream.ReadNumber(Length - 1)
     65    else Result := Stream.ReadNumber(Length);
     66  if Length > 1 then Result := Result or (QWord(1) shl (Length - 1));
    5067end;
    5168
Note: See TracChangeset for help on using the changeset viewer.