AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Video aus (Teil-)Stream abspielen
Thema durchsuchen
Ansicht
Themen-Optionen

Video aus (Teil-)Stream abspielen

Offene Frage von "dominikkv"
Ein Thema von dominikkv · begonnen am 26. Feb 2010 · letzter Beitrag vom 4. Mär 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.558 Beiträge
 
Delphi 12 Athens
 
#1

Re: Video aus (Teil-)Stream abspielen

  Alt 1. Mär 2010, 09:03
Soo, ich glaub jetzt dürfte es soweit stimmen.

'ne Positionsprüfung bei Read- und Write-Zugriffen gibt's nun,
denn der Zugriff über den "Hauptstream" existiert ja weiterhin, so daß von dort aus auch was geändert werden könnte, welches so jetzt abgefangen wird.

In .Create wird der Hauptstream absichtlich nicht geprüft, denn Assigned(Stream) würde nur den einen Fall eines NIL-Pointers abgefangen, aber eine ungültige Objektvariable kann einfach nicht mit Sicherheit erkannt werden.

Die Streamgröße kann nun auch geändert werden, aber nur wenn der TeilStream am Ende des Hauptstreams liegt und somit nichts Nachfolgendes gelöscht werden könnte.

Und das Wichtigste: Das fehlerhafte Seek/Position wurde überarbeitet.

Delphi-Quellcode:
Unit StreamPart;

Interface
  Uses SysUtils, Classes, Math;

  Type TStreamPart = Class(TStream)
    Private
      _Stream: TStream;
      _Offset, _MaxLen: Int64;
    Protected
      Function GetSize: Int64; Override;
      Procedure SetSize(NewSize: LongInt); Overload; Override;
      Procedure SetSize(Const NewSize: Int64); Overload; Override;
    Public
      Constructor Create(Stream: TStream; Const Offset, MaxLength: Int64);
      Function Read(Var Buffer; Count: LongInt): LongInt; Override;
      Function Write(Const Buffer; Count: LongInt): LongInt; Override;
      Function Seek(Offset: LongInt; Origin: Word): LongInt; Overload; Override;
      Function Seek(Const Offset: Int64; Origin: TSeekOrigin): Int64; Overload; Override;
    End;

Implementation

  Function TStreamPart.GetSize: Int64;
    Begin
      Result := Min(Max(_Stream.Size - _Offset, 0), _MaxLen);
    End;

  Procedure TStreamPart.SetSize(NewSize: LongInt);
    Begin
      SetSize(Int64(NewSize));
    End;

  Procedure TStreamPart.SetSize(Const NewSize: Int64);
    Begin
      If _Stream.Size <= _Offset + _MaxLen Then
        _Stream.Size := _Offset + NewSize
      Else Raise Exception.Create('The StreamPart must lie at the '
          + 'end of the main stream to change its size to be allowed.');
    End;

  Constructor TStreamPart.Create(Stream: TStream; Const Offset, MaxLength: Int64);
    Begin
      _Stream := Stream;
      _Offset := Offset;
      _MaxLen := MaxLength;
    End;

  Function TStreamPart.Read(Var Buffer; Count: LongInt): LongInt;
    Var Pos: Int64;

    Begin
      Pos := _Stream.Position;
      If (Pos < _Offset) or (Pos >= _Offset + _MaxLen) Then
        Raise Exception.Create('The .Position is out of range.');
      Result := _Stream.Read(Buffer, Min(Int64(Count), _Stream.Size - Pos));
    End;

  Function TStreamPart.Write(Const Buffer; Count: LongInt): LongInt;
    Var Pos: Int64;

    Begin
      Pos := _Stream.Position;
      If (Pos < _Offset) or (Pos >= _Offset + _MaxLen) Then
        Raise Exception.Create('The .Position is out of range.');
      Result := _Stream.Write(Buffer, Min(Int64(Count), _Stream.Size - Pos));
    End;

  Function TStreamPart.Seek(Offset: LongInt; Origin: Word): LongInt;
    Begin
      Result := Seek(Int64(Offset), TSeekOrigin(Origin));
    End;

  Function TStreamPart.Seek(Const Offset: Int64; Origin: TSeekOrigin): Int64;
    Begin
      Case Origin of
        soEnd: Offset := _Offset + _MaxLen + Offset;
        soCurrent: Offset := _Stream.Position + Offset;
        Else Offset := _Offset + Offset;
      End;
      Result := _Stream.Seek(Min(Max(Offset, _Offset), _Offset + _MaxLen), soBeginning);
    End;

End.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz