type
PURLProtocol = ^TURLProtocol;
PURLContext = ^TURLContext;
TURLContext = record
av_class: PAVClass;
prot: PURLProtocol;
priv_data: pointer;
filename: PAnsiChar;
flags: Integer;
max_packet_size: Integer;
is_streamed: Integer;
is_connected: Integer;
interrupt_callback: TAVIOInterruptCB;
rw_timeout: Int64;
end;
TURLProtocol = record
name: PAnsiChar;
url_open: function(h: PURLContext; url: PAnsiChar; flags: integer)
: integer; cdecl;
url_open2: function(h: PURLContext; url: PAnsiChar; flags: integer;
var options: PAVDictionary): integer; cdecl;
url_read: function(h: PURLContext; buf: PByte; size: integer)
: integer; cdecl;
url_write: function(h: PURLContext; buf: PByte; size: integer)
: integer; cdecl;
url_seek: function(h: PURLContext; pos: int64; whence: integer)
: int64; cdecl;
url_close: function(h: PURLContext): integer; cdecl;
next: PURLProtocol;
url_read_pause: function(h: PURLContext; pause: integer): integer; cdecl;
url_read_seek: function(h: PURLContext; stream_index: integer;
timestamp: int64; flags: integer): int64; cdecl;
url_get_file_handle: function(h: PURLContext): integer; cdecl;
url_get_multi_file_handle: function(h: PURLContext; var handles: PInteger;
var numhandles: integer): integer; cdecl;
url_shutdown: function(h: PURLContext; flags: integer): integer; cdecl;
priv_data_size: integer;
priv_data_class: PAVClass;
flags: integer;
url_check: function(h: PURLContext; mask: integer): integer; cdecl;
end;
function TCustomPlayer.GetShoutcastMeta: string;
var
V: PAnsiChar;
Prot: PURLContext;
begin
V := nil;
Result := '';
if (not Assigned(FFormatCtx)) then
exit;
if (not Assigned(FFormatCtx^.pb)) then
exit;
if not Assigned(FFormatCtx^.pb^.opaque) then
exit;
Prot := PURLContext(FFormatCtx^.pb^.opaque);
if Assigned(Prot) and Assigned(Prot^.priv_data) then
begin
av_opt_get(Prot^.priv_data, 'icy_metadata_packet', 0, V);
if Assigned(V) then
begin
Result := V;
av_free(V);
end;
end;
end;