Multimediale Datenbanken mit Oracle8i interMedia Audio, Image and Video Vortrag für Oberseminar Datenbanken Michael Maduch Michael Maduch 1 Inhalt • • • • 1. Einleitung 2. ORDAudio 3. ORDVideo 4. ORDImage Michael Maduch 2 Einleitung - interMedia Audio, Image and Video ist eine Komponente von Oracle8i interMedia - diese Komponente erlaubt die Verwaltung von Bilder, Tönen und Video in einer integrierten Weise mit anderen Unternehmensinformationen über Objekttypen und benutzerdefinierte Datentypen - interMedia audio, image and video unterstützt das Speichern, Wiederfinden und Verwalten multimedialer Daten in Oracle8i Michael Maduch 3 Einleitung - folgendes kann verwaltet werden: - Binary large objects (BLOBs) - File-based large objects (BFILEs) - URLs - Streaming audio or video - andere spezielle Multimediaformate Michael Maduch 4 Einleitung - Oracle8i benutzt Objekttypen, ähnlich Java und C++Klassen, zum beschreiben von Sound-, Bild- und Videodaten - diese Objekttypen sind: - ORDAudio für Audiodaten - ORDVideo für Videodaten - ORDImage für Bilddaten - ORDSource für Anwendungen Michael Maduch 5 Einleitung - diese Objekte enthalten Attribute (Metadaten und Mediendaten) und Methoden (zur Datenmanipulation) - Mediendaten sind Daten zum aktuellen Medium - Metadaten sind Informationen über die Daten, wie - Objektlänge, Kompression, Format Speicherinformationen (Datentyp, Speicherplatz/Ort) Sourcenamen Charakteristische Daten der jeweiligen Medien (Audio, Video oder Bild) - Methoden sind Prozeduren, welche auf die Objekte angewendet werden können, z.B. getContent() oder process() Michael Maduch 6 Einleitung - die interMedia-Objekte (ORDAudio, ORDVideo,...) haben ein gemeinsames Speichermodell für Daten - gespeichert werden kann in einer Datenbank, in einem BLOB, dabei unterstützt die Transaktionskontrolle von Oracle oder - außerhalb einer Datenbank (BFILEs, HTTP-Server, Medien-Server) Michael Maduch 7 Einleitung - Oracle8i interMedia audio, image and video ist so entworfen, daß es erweitert werden kann - von Haus aus unterstützt es eine Basis-Menge an Audio-, Bild- und Videodaten-Eigenschaften - erweiterbar mit Hilfe von: - Erzeugen eines neuen Formates, basierend auf Definition vorhandener Formate - Erzeugen neuer Plugins für erweiterte Unterstützung bei den Mediendaten Michael Maduch 8 Einleitung - Oracle8i ist ein ORDB-Verwaltungssystem - Objektrelationale Typen: ORDAudio, ORDVideo ORDImage ORDSource - weitere Informationen darüber: - Oracle8i Application Developer´s Guide - Large Objects (LOBs) - Oracle8i Concepts Michael Maduch 9 Einleitung - Anwendungen können mir Hilfe von SQL, PL/SQL oder Java über ORD-Typen auf MM-Daten zugreifen und diese auch manipulieren - für Benutzung von Java siehe auch: Oracle8i interMedia audio, image and video Java Client User‘s Guide and Reference Michael Maduch 10 Einleitung - Zugriff auf Attribute innerhalb eines Objekts erfolgt mit der Syntax: variable.data_attribute - Aufruf von Methoden eines Objekts erfolgt mit der Syntax: variable.function(parameter1,parameter2,...) Michael Maduch 11 Der Dateityp Audio Michael Maduch 12 Audio - unterstützte Audioformate Format WAV Format ID ‘WAVE’ File Format: ‘WAVE’ File Ext: .wav Choose one of these compression formats: Michael Maduch Audio Feature Single channel Stereo 8-bit samples 16-bit samples Linear PCM encoding Compression Format Uncompressed Microsoft ADPCM 13 Audio Format AU Format ID ‘AUFF’ File Format: ‘AUFF’ File Ext: .au Michael Maduch Audio Feature Single channel Stereo 8-bit samples 16-bit samples Mu-law encoding Linear PCM encoding Compression Format Uncompressed 14 Audio - weitere Audioformate: - AIFF - Format - AIFF-C - Format Michael Maduch 15 Audio - Definition des Typs ORDAudio CREATE OR REPLACE TYPE ORDAudio AS OBJECT ( -- ATTRIBUTES description VARCHAR2(4000), source ORDSource, format VARCHAR2(31), mimeType VARCHAR2(4000), comments CLOB, Michael Maduch 16 -- AUDIO RELATED ATTRIBUTES encoding VARCHAR2(256), numberOfChannels INTEGER, samplingRate INTEGER, sampleSize INTEGER, compressionType VARCHAR2(4000), audioDuration INTEGER, -- METHODS -- Methods associated with the date attribute MEMBER FUNCTION getUpdateTime RETURN DATE, PRAGMA RESTRICT_REFERENCES(getUpdateTime, WNDS, WNPS, RNDS, RNPS), MEMBER PROCEDURE setUpdateTime(current_time DATE), -- Methods associated with the description attribute MEMBER PROCEDURE setDescription(user_description IN VARCHAR2), MEMBER FUNCTION getDescription RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getDescription, WNDS, WNPS, RNDS, RNPS), Michael Maduch 17 -- Methods associated with the mimeType attribute MEMBER PROCEDURE setMimeType(mime IN VARCHAR2), MEMBER FUNCTION getMimeType RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getMimeType, WNDS, WNPS, RNDS, RNPS), -- Methods associated with the source attribute MEMBER FUNCTION processSourceCommand( ctx IN OUT RAW, cmd IN VARCHAR2, arguments IN VARCHAR2, result OUT RAW) RETURN RAW, MEMBER FUNCTION isLocal RETURN BOOLEAN, PRAGMA RESTRICT_REFERENCES(isLocal, WNDS, WNPS, RNDS, RNPS), MEMBER PROCEDURE setLocal, MEMBER PROCEDURE clearLocal, Michael Maduch 18 MEMBER PROCEDURE setSource( source_type IN VARCHAR2, source_location IN VARCHAR2, source_name IN VARCHAR2), MEMBER FUNCTION getSource RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getSource, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getSourceType RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getSourceType, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getSourceLocation RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getSourceLocation, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getSourceName RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getSourceName, WNDS, WNPS, RNDS, RNPS), Michael Maduch 19 MEMBER PROCEDURE import(ctx IN OUT RAW), MEMBER PROCEDURE importFrom( ctx IN OUT RAW, source_type IN VARCHAR2, source_location IN VARCHAR2, source_name IN VARCHAR2), MEMBER PROCEDURE export( ctx IN OUT RAW, source_type IN VARCHAR2, source_location IN VARCHAR2, source_name IN VARCHAR2), MEMBER FUNCTION getContentLength(ctx IN OUT RAW) RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(getContentLength, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getContentInLob( ctx IN OUT RAW, dest_lob IN OUT NOCOPY BLOB, mimeType OUT VARCHAR2, format OUT VARCHAR2), Michael Maduch 20 MEMBER FUNCTION getContent RETURN BLOB, PRAGMA RESTRICT_REFERENCES(getContent, WNDS, WNPS, RNDS, RNPS), MEMBER PROCEDURE deleteContent, -- Methods associated with file operations on the source MEMBER FUNCTION openSource(userArg IN RAW, ctx OUT RAW) RETURN INTEGER, MEMBER FUNCTION closeSource(ctx IN OUT RAW) RETURN INTEGER, MEMBER FUNCTION trimSource(ctx IN OUT RAW, newlen IN INTEGER) RETURN INTEGER, MEMBER PROCEDURE readFromSource( ctx IN OUT RAW, startPos IN INTEGER, numBytes IN OUT INTEGER, buffer OUT RAW), MEMBER PROCEDURE writeToSource( ctx IN OUT RAW, startPos IN INTEGER, numBytes IN OUT INTEGER, buffer IN RAW), Michael Maduch 21 -- Methods associated with the comments attribute MEMBER PROCEDURE appendToComments(amount IN BINARY_INTEGER, buffer IN VARCHAR2), MEMBER PROCEDURE writeToComments(offset IN INTEGER, amount IN BINARY_INTEGER, buffer IN VARCHAR2), MEMBER FUNCTION readFromComments(offset IN INTEGER, amount IN BINARY_INTEGER := 32767) RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(readFromComments, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION locateInComments(pattern IN VARCHAR2, offset IN INTEGER := 1, occurrence IN INTEGER := 1) RETURN INTEGER, MEMBER PROCEDURE trimComments(newlen IN INTEGER), MEMBER PROCEDURE eraseFromComments(amount IN OUT NOCOPY INTEGER, offset IN INTEGER := 1), Michael Maduch 22 MEMBER PROCEDURE deleteComments, MEMBER PROCEDURE loadCommentsFromFile(fileobj IN BFILE, amount IN INTEGER, from_loc IN INTEGER := 1, to_loc IN INTEGER := 1), MEMBER PROCEDURE copyCommentsOut(dest IN OUT NOCOPY CLOB, amount IN INTEGER, from_loc IN INTEGER := 1, to_loc IN INTEGER := 1), MEMBER FUNCTION compareComments( compare_with_lob IN CLOB, amount IN INTEGER := 4294967295, starting_pos_in_comment IN INTEGER := 1, starting_pos_in_compare IN INTEGER := 1) RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(compareComments, WNDS, WNPS, RNDS,RNPS), MEMBER FUNCTION getCommentLength RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(getCommentLength, WNDS, WNPS, RNDS, RNPS), Michael Maduch 23 -- Methods associated with audio attributes accessors MEMBER PROCEDURE setFormat(knownformat IN VARCHAR2), MEMBER FUNCTION getFormat RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getFormat, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getFormat(ctx IN OUT RAW) RETURN VARCHAR2, MEMBER PROCEDURE setEncoding(knownEncoding IN VARCHAR2), MEMBER FUNCTION getEncoding RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getEncoding, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getEncoding(ctx IN OUT RAW) RETURN VARCHAR2, MEMBER PROCEDURE setNumberOfChannels(knownNumberOfChannels IN INTEGER), MEMBER FUNCTION getNumberOfChannels RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(getNumberOfChannels, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getNumberOfChannels(ctx IN OUT RAW) RETURN INTEGER, MEMBER PROCEDURE setSamplingRate(knownSamplingRate IN INTEGER), MEMBER FUNCTION getSamplingRate RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(getSamplingRate, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getSamplingRate(ctx IN OUT RAW) RETURN INTEGER, Michael Maduch 24 MEMBER PROCEDURE setSampleSize(knownSampleSize IN INTEGER), MEMBER FUNCTION getSampleSize RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(getSampleSize, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getSampleSize(ctx IN OUT RAW) RETURN INTEGER, MEMBER PROCEDURE setCompressionType(knownCompressionType IN VARCHAR2), MEMBER FUNCTION getCompressionType RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(getCompressionType, WNDS, WNPS, RNDS,RNPS), MEMBER FUNCTION getCompressionType(ctx IN OUT RAW) RETURN VARCHAR2, MEMBER PROCEDURE setAudioDuration(knownAudioDuration IN INTEGER), MEMBER FUNCTION getAudioDuration RETURN INTEGER, PRAGMA RESTRICT_REFERENCES(getAudioDuration, WNDS, WNPS, RNDS, RNPS), MEMBER FUNCTION getAudioDuration(ctx IN OUT RAW) RETURN INTEGER, MEMBER PROCEDURE setKnownAttributes(knownFormat IN VARCHAR2, knownEncoding IN VARCHAR2, knownNumberOfChannels IN INTEGER, knownSamplingRate IN INTEGER, knownSampleSize IN INTEGER, knownCompressionType IN VARCHAR2, knownAudioDuration IN INTEGER), Michael Maduch 25 -- Methods associated with setting all the properties MEMBER PROCEDURE setProperties(ctx IN OUT RAW), MEMBER FUNCTION checkProperties(ctx IN OUT RAW) RETURN BOOLEAN, MEMBER FUNCTION getAttribute( ctx IN OUT RAW, name IN VARCHAR2) RETURN VARCHAR2, MEMBER PROCEDURE getAllAttributes( ctx IN OUT RAW, attributes IN OUT NOCOPY CLOB), -- Methods associated with audio processing MEMBER FUNCTION processAudioCommand( ctx IN OUT RAW, cmd IN VARCHAR2, arguments IN VARCHAR2, result OUT RAW) RETURN RAW ); Michael Maduch 26 Audio - werden Methoden benutzt, die als erstes Argument “ctx” haben, müssen Voraussetzungen geschaffen werden - vor dem ersten Aufruf dieser Methoden muß der Client die ctx-Struktur allokieren und mit “NULL” initialisieren und anschließend die openSoucre()Methode aufrufen - jetzt kann das Source-Plugin den Kontext für den Client initialisieren - wenn die Verarbeitung beendet ist, sollte der Client die closeSource()-Methode aufrufen Michael Maduch 27 Audio Beispiel einer Audio - Tabellen - Definition CREATE TABLE TAUD(n NUMBER, aud ORDSYS.ORDAUDIO) storage (initial 100K next 100K pctincrease 0); INSERT INTO TAUD VALUES(1, ORDSYS.ORDAudio( NULL, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL), NULL, NULL, EMPTY_CLOB(), NULL, 0, 0, 0, NULL, 0) ); Michael Maduch 28 Audio INSERT INTO TAUD VALUES(2, ORDSYS.ORDAudio( NULL, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL), NULL, NULL, EMPTY_CLOB(), NULL, 0, 0, 0, NULL, 0) ); CREATE TABLE TS(n NUMBER, s ORDSYS.ORDSOURCE); INSERT INTO TS VALUES(1, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL)); INSERT INTO TS VALUES(2, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL)); Michael Maduch 29 Audio INSERT INTO TS VALUES(3, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL)); INSERT INTO TS VALUES(4, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL)); Michael Maduch 30 Audio - Packages oder PL/SQL-Plugins - dienen als Anleitung für Entwicklung eigener Audioformate - als Beispiel das Package: ORDPLUGINS.ORDX_DEFAULT_AUDIO CREATE OR REPLACE PACKAGE ORDX_DEFAULT_AUDIO authid current_user AS --AUDIO ATTRIBUTES ACCESSORS FUNCTION getFormat(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN VARCHAR2; Michael Maduch 31 FUNCTION getEncoding(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN VARCHAR2; FUNCTION getNumberOfChannels(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN INTEGER; FUNCTION getSamplingRate(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN INTEGER; FUNCTION getSampleSize(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN INTEGER; FUNCTION getCompressionType(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN VARCHAR2; FUNCTION getAudioDuration(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN INTEGER; PROCEDURE setProperties(ctx IN OUT RAW, obj IN OUT NOCOPY ORDSYS.ORDAudio); FUNCTION checkProperties(ctx IN OUT RAW, obj IN OUT ORDSYS.ORDAudio) RETURN NUMBER; FUNCTION getAttribute(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio, name IN VARCHAR2) RETURN VARCHAR2; Michael Maduch 32 PROCEDURE getAllAttributes(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio, attributes IN OUT NOCOPY CLOB); --AUDIO PROCESSING METHODS FUNCTION processCommand(ctx IN OUT RAW, obj IN OUT NOCOPY ORDSYS.ORDAudio, cmd IN VARCHAR2, arguments IN VARHAR2, result OUT RAW) RETURN RAW; PRAGMA RESTRICT_REFERENCES(getFormat, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getEncoding, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getNumberOfChennels, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getSamplingRate, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getSampleSize, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getCompressionType, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getAttribute, WNDS, WNPS, RNDS, RNPS); PRAGMA RESTRICT_REFERENCES(getAudioDuration, WNDS, WNPS, RNDS, RNPS); END; / Michael Maduch 33 Audio - weiter Packages ORDPLUGINS.ORDX_AUFF_AUDIO - Package ORDPLUGINS.ORDX_AIFF_AUDIO - Package ORDPLUGINS:ORDX_AIFC_AUDIO - Package ORDPLUGINS.ORDX_WAVE_AUDIO - Package Michael Maduch 34 Audio - Erweiterung von interMedia für Unterstützung neuer Audioformate - dies geschieht in 4 Schritten: - entwerfen eines neuen Audiodatenformates - implementieren des neuen Formates und benennen, z.B.: ORDX_MY_AUDIO.SQL - installieren des neuen Plugins unter ORDPLUGINS - Zugriffsrechte freigeben, z.B. für PUBLIC Michael Maduch 35 Audio - Package-Listing für eigenes Audioformat CREATE OR REPLACE PACKAGE BODY ORDX_MY_AUDIO AS --AUDIO ATTRIBUTES ACCESSORS FUNCTION getFormat(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN VARCHAR2 IS --Your variables go here BEGIN --Your code goes here END; Michael Maduch 36 Audio FUNCTION getEncoding(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN VARCHAR2 IS --Your variables go here BEGIN --Your code goes here END; FUNCTION getNumberOfChannels(ctx IN OUT RAW, obj IN ORDSYS.ORDAudio) RETURN INTEGER IS --Your variables go here BEGIN --Your code goes here END; ... Michael Maduch 37 Audio - Beispiele Define a Song Object CREATE TYPE songObject as OBJECT ( cdRef REF CdObject, -- REF into the cd table songId VARCHAR2(20), title VARCHAR2(4000), artist VARCHAR2(4000), awards VARCHAR2(4000), timePeriod VARCHAR2(20), duration INTEGER, clipRef REF clipObject, -- REF into the clips table (music video) txtcontent CLOB, audioSource ORDSYS.ORDAUDIO ); Michael Maduch 38 Audio Create a Table Named SongsTable CREATE TABLE SongsTable of songObject (UNIQUE (songId), songId NOT NULL); Michael Maduch 39 Audio Insert a Song into the SongsTable Table -- insert a song into the songs table INSERT INTO SongsTable VALUES (NULL, ’00’, ’Under Pressure’, ’Queen’, ’no awards’, ’80-90’, 243, NULL, EMPTY_CLOB(), ORDSYS.ORDAudio(NULL, ORDSYS.ORDSource(EMPTY_BLOB(),NULL,NULL,NULL,NULL,NULL), NULL, NULL, EMPTY_CLOB(), NULL, NULL, NULL, NULL, NULL, NULL)); -- check songs insertion SELECT s.title FROM SongsTable s WHERE songId = ’00’ Michael Maduch 40 Der Datentyp Video Michael Maduch 41 Video - die Definition des Typs ORDVideo CREATE OR REPLACE TYPE ORDVideo AS OBJECT ( -- ATTRIBUTES description VARCHAR2(4000), source ORDSource, format VARCHAR2(31), mimeType VARCHAR2(4000), comments CLOB, Michael Maduch 42 Video -- VIDEO RELATED ATTRIBUTES width INTEGER, height INTEGER, frameResolution INTEGER, frameRate INTEGER, videoDuration INTEGER, numberOfFrames INTEGER, compressionType VARCHAR2(4000), numberOfColors INTEGER, bitRate INTEGER, -- METHODS ... Michael Maduch 43 Video - werden Methoden benutzt, die als erstes Argument “ctx” haben, müssen Voraussetzungen geschaffen werden - vor dem ersten Aufruf dieser Methoden muß der Client die ctx-Struktur allokieren und mit “NULL” initialisieren und anschließend die openSoucre()Methode aufrufen - jetzt kann das Source-Plugin den Kontext für den Client initialisieren - wenn die Verarbeitung beendet ist, sollte der Client die closeSource()-Methode aufrufen Michael Maduch 44 Video - Beispiel einer Video-Tabellen-Definition CREATE TABLE TVID(n NUMBER, vid ORDSYS.ORDVIDEO) storage (initial 100K next 100K pctincrease 0); INSERT INTO TVID VALUES(1, ORDSYS.ORDVideo( NULL, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL, SYSDATE, NULL), NULL, NULL, EMPTY_CLOB(),0,0,0,0,0,0,0,0,0) ); Michael Maduch 45 Video INSERT INTO TVID VALUES(2, ORDSYS.ORDVideo( NULL, ORDSYS.ORDSOURCE(EMPTY_BLOB(), NULL, NULL, NULL,SYSDATE,NULL), NULL, NULL, EMPTY_CLOB(),0,0,0,0,0,0,0,0,0) ); Michael Maduch 46 Video - Packages oder PL/SQL-Plugins ORDPLUGINS.ORDX_DEFAULT_VIDEO - Package - dient als Anleitung zur Entwicklung eigener Videoformate - weitere Packages ORDPLUGINS.ORDX_AVI_VIDEOAUDIO - Package ORDPLUGINS:ORDX_QT_VIDEO - Package ORDPLUGINS.ORDX_MOOV_VIDEO - Package ORDPLUGINS.ORDX_MPEG_VIDEO - Package Michael Maduch 47 Video - Erweiterung von interMedia zur Unterstützung neuer Videoformate - dies geschieht in 4 Schritten - entwerfen eines neuen Videodatenformates - implementieren des neuen Formates und benennen, z.B.: ORDX_MY_VIDEO.SQL - installieren des neuen Plugins unter ORDPLUGINS - Zugriffsrechte freigeben, z.B. für PUBLIC Michael Maduch 48 Video - Package für eigenes Audioformat CREATE OR REPLACE PACKAGE BODY ORDX_MY_VIDEO AS --VIDEO ATTRIBUTES ACCESSORS FUNCTION getFormat(ctx IN OUT RAW, obj IN ORDSYS.ORDVideo) RETURN VARCHAR2 IS --Your variables go here BEGIN --Your code goes here END; ... Michael Maduch 49 - Beispiele Define a Clip Object CREATE TYPE clipObject as OBJECT ( videoRef REF VideoObject, clipId VARCHAR2(20), title VARCHAR2(4000), director VARCHAR2(4000), casting ORDSYS.ORDAnnotations, category VARCHAR2(20), copyright VARCHAR2(4000), producer VARCHAR2(4000), awards VARCHAR2(4000), timePeriod VARCHAR2(20), rating VARCHAR2(256), duration INTEGER, cdRef REF CdObject, txtcontent CLOB, coverImg REF ORDSYS.ORDImage, videoSource ORDSYS.ORDVideo ); Michael Maduch -- REF into the video table -- Id inside of the clip table -- Pairs of characters/actors -- REF into a CdObject(soundtrack) -- REF into the ImageTable 50 Video Create a Table Named clipsTable CREATE TABLE ClipsTable of clipObject (UNIQUE (clipId), clipId NOT NULL) NESTED TABLE casting.annotations STORE AS annot_store_table2; Michael Maduch 51 Video Insert a Video Clip into the clipsTable Table -- Insert a Video Clip into the ClipsTable insert into ClipsTable values (NULL, ’11’, ’Oracle Commercial’, ’Larry Ellison’, ORDSYS.ORDAnnotations(NULL), ’commercial’, ’Oracle Corporation’, ’’, ’no awards’, ’90s’ ’no rating’, Michael Maduch 52 Video 30, NULL, EMPTY_CLOB(), NULL, ORDSYS.ORDVIDEO(’Oracle Commercial 1 Video Clip’, ORDSYS.ORDSource(EMPTY_BLOB(),NULL,NULL,NULL,NULL,NULL), ’QuickTime File Format’, ’video/quicktime’, EMPTY_CLOB(), 160, 120, 72, 15, 30, 450, ’Cinepak’, 256, 15000)); Michael Maduch 53 Der Datentyp Image Michael Maduch 54 Image - die unterstützten Bildformate Format BMP File Format: ‘BMPF’ File Ext: .bmp Mime: image/bmp Choose one of these compression formats: Choose one or more of these content formats: Michael Maduch Pixel Format Monochrome 4-bit LUT 8-bit LUT 16-bit RGB 24-bit RGB 32-bit RGB Compression Format Uncompressed BMPRLE (for 8-bit LUT) Data Description Inverse DIB OS/2 format Support Read/Write Read Read/Write Read Read/Write Read Support Read/Write Read/Write Support Read Read 55 Image Format GIF Pixel Format Monochrome 8-bit LUT Support Read Read/Write Compression Format GIFLZW (LZW) Data Description NA Support Read/Write Support NA File Format: ‘GIFF’ File Ext: .gif Mime: image/gif NOTE: interMedia image has limited support for animated GIF images; there is setProperties( ) support; however, processing using the process( ) and processCopy( ) (or Analyze) methods is not supported. Michael Maduch 56 Image - weitere Bildformate: Michael Maduch CALS Raster - Format JFIF - Format PCX - Format PICT - Format Raw Pixel - Format Sun Raster - Format Targa - Format TIFF - Format 57 Image - Definition des Typs ORDImage CREATE OR REPLACE TYPE ORDImage AS OBJECT ( -- TYPE ATTRIBUTES source ORDSource, height INTEGER, width INTEGER, contentLength INTEGER, fileFormat VARCHAR2(4000), contentFormat VARCHAR2(4000), compressionFormat VARCHAR2(4000), mimeType VARCHAR2(4000), -- METHOD DECLARATION ... Michael Maduch 58 Image - werden Methoden benutzt, die als erstes Argument “ctx” haben, müssen Voraussetzungen geschaffen werden - vor dem ersten Aufruf dieser Methoden muß der Client die ctx-Struktur allokieren und mit “NULL” initialisieren und anschließend die Soucre.open()Methode aufrufen - jetzt kann das Source-Plugin den Kontext für den Client initialisieren - wenn die Verarbeitung beendet ist, sollte der Client die Source.close()-Methode aufrufen Michael Maduch 59 Image - Beispiel einer Video-Tabellen-Definition CREATE TABLE emp ( ename VARCHAR2(50), salary NUMBER, job VARCHAR2(50), department INTEGER, photo ORDSYS.ORDImage, large_photo ORDSYS.ORDImage); DECLARE Image ORDSYS.ORDImage; Michael Maduch 60 Image BEGIN INSERT INTO emp VALUES (’John Doe’, 24000, ’Technical Writer’, 123, ORDSYS.ORDImage(ORDSYS.ORDSource(empty_blob(),’file’,’ORDIMGDIR’, ’jdoe.gif’,SYSDATE,0), NULL,NULL,NULL,NULL,NULL,NULL,NULL), ORDSYS.ORDImage(ORDSYS.ORDSource(empty_blob(),’file’,’ORDIMGDIR’, ’jdoe.gif’,SYSDATE,0), NULL,NULL,NULL,NULL,NULL,NULL,NULL)); SELECT large_photo INTO Image FROM emp WHERE ename = ’John Doe’ FOR UPDATE; Image.setProperties; UPDATE emp SET large_photo = Image WHERE ename = ’John Doe’; COMMIT; END; / Michael Maduch 61 Image - Beispiele Adding a New Column of Type ORDImage to the emp Table ALTER TABLE emp ADD (photo ORDSYS.ORDImage); Michael Maduch 62 Image Adding ORDImage Types to a New Table CREATE TABLE emp ( ename VARCHAR2(50), salary NUMBER, job VARCHAR2(50), department INTEGER, photo ORDSYS.ORDImage, large_photo ORDSYS.ORDImage ); Michael Maduch 63 Image Insert a Row into a Table with Empty Data in the ORDImage Type Column (BLOB) INSERT INTO emp VALUES ( ’John Doe’, 24000, ’Technical Writer’, 123, ORDSYS.ORDImage(ORDSYS.ORDSource(empty_blob(), NULL,NULL,NULL,SYSDATE,1), NULL,NULL,NULL,NULL,NULL,NULL,NULL)); Insert a Row into a Table with an Image in the ORDImage Type Column (BFILE) INSERT INTO emp VALUES ( ’John Doe’, 24000, ’Technical Writer’, 123, ORDSYS.ORDImage(ORDSYS.ORDSource(empty_blob(),’file’,’ORDIMGDIR’, ’jdoe.gif’,SYSDATE,0), NULL,NULL,NULL,NULL,NULL,NULL,NULL)); Michael Maduch 64 Image Inhalts-basierte Suche bei Bilddaten - dies läßt Fragen basierend auf innere visuelle Attribute der Bilder durchführen - zum Beispiel Farbe, Struktur oder Textur - man ist nicht nur auf Schlüsselworte oder ähnliches angewiesen - die zu Grunde liegende Technologie wurde von Virage, Inc, einem führendem Unternehmen auf diesem Gebiet entwickelt Michael Maduch 65 Image - ein Beispiel: - eine Datenbank mit Bildern von Autos - man will alle roten Autos suchen - zuerst ein Bild mit rotem Auto auswählen und dann ähnliche Bilder suchen - da Autos aber immer irgendwie ähnlich aussehen, kann die Genauigkeit der Abfrage noch erhöht werden, indem man der Farbe mehr Gewicht verleiht als z.B. der Struktur Michael Maduch 66 Image - Anwendungen können mir Hilfe von SQL, PL/SQL oder Java über ORDVir Bilder zugreifen und diese auch manipulieren - für Benutzung von Java siehe auch: Oracle8i Visual Information Retrieval Java Client User’s Guide and Reference Michael Maduch 67 Image - Zugriff auf Attribute innerhalb eines Objekts erfolgt mit der Syntax: variable.data_attribute - Aufruf von Methoden eines Objekts erfolgt mit der Syntax: variable.function(parameter1,parameter2,...) Michael Maduch 68 Image - es gibt zwei Möglichkeiten um Bilder suchen zu lassen: - über Informationen die Benutzer in DB eingetragen hat, wie Titel, beschreibende Schlüsselwörter in eingeschränktem Vokabular oder vorbestimmten Klassifikationen - über automatische Bildmerkmalsextraktion und Gegenstandserkennung, um Bildinhalt einzustufen, das ist Vorgehensweise bei inhalts-basierender Suche Michael Maduch 69 Image - der primäre Vorteil beim Benutzen der inhalts-basierenden Suche ist die Verringerung von Zeit und Aufwand beim Beschaffen von bild-basierenden Informationen - einige Gebiete, wo inhalts-basierende Suche nützlich sein kann: (hier ist die Abfrage: finde Gegenstand, der wie dieser aussieht) - Warenzeichen und Copyrights Kunstgalerien und Museen Mode und Stoff-Design Kriminaltechnik - so könnte ein Käufer im Internet-Shop eine Suchanfrage eingeben: “Finde grünen Mantel mit roten Punkten” Michael Maduch 70 Image - ein inhatsbasierendes Suchsystem verarbeitet die enthaltenen Bilddaten und erschafft ein abstraktes Objekt dieses Inhalts in Hinsicht auf die visuellen Eigenschaften - einige Abfragen werden mit dem abstrakten Objekt schneller fertig, als mit dem Bild - so wird jedes Bild einer Datenbank analysiert und eine kompakte Repräsentation seines Inhalts in einer “Signatur” abgelegt Michael Maduch 71 Image - so eine Signatur enthält beispielsweise: global Color: Verteilung der Farben innerhalb des Bildes, diese Verteilung schließt alle Farben ein, aber nicht die Lage local Color: Verteilung der Farbe und wo sie im Bild vorkommt Texture: low-level Muster und Texturen innerhalb des Bildes, wie z.B. Körnigkeit oder Ebenheit Structure: Formen, die im Bild erscheinen, sie werden bestimmt durch Formcharakterisierungstechniken, wie Kantenerkennung Facial: repräsentiert die einzigartigen Charakteristiken von Gesichtern, wie Form und Größe der Nase, Augenabstand,... aber: Gesichtssignaturen werden mit einer separat erhältlichen Software (kaufen) von Viisage Technology, Inc. Michael Maduch 72 Image - all diese Kenndaten für visuelle Attribute werden in der Signatur gespeichert, diese hat eine Größe zwischen 1000 und 2000 Byte - für bessere Performance bei großen Bilddatenbanken ist es besser einen Index, basierend auf den Signaturen, zu erstellen Michael Maduch 73 Image - Bild kann gefunden werden, indem es mit einem Vergleichsbild zusammenpaßt (übereinstimmt) - der Vergleichsvorgang erfordert die Signaturen beider Bilder - Bilder sind aber selten gleich und so wird der Vergleich über eine ähnlichkeitsmessende Funktion, basierend auf den visuellen Attributen, geführt - als Ergebnis entsteht eine verhältnismäßige Entfernung zwischen beiden Bildern - dieses Ergebnis wird benutzt, um den Grad der Ähnlichkeit herauszufinden - kleinere Entfernung bedeutet bessere Übereinstimmung der Bilder Michael Maduch 74 Image - globale und lokale Farben - wie gesagt: globale Farben repräsentieren die Verteilung von Farben innerhalb eines Bildes, und lokale Farben repräsentieren die Verteilung einzelner Farben und ihre Lage im Bild Michael Maduch 75 Image Bild 1 Bild 2 - werden die Bilder nun auf global Farben verglichen, dann sind sie gleich: - Ergebnis der ähnlichkeitsmessenden Funktion ist 0.0, weil jede Farbe mit gleicher Prozentzahl in beiden Bildern vorkommt - werden die Bilder auch nach lokalen Farbe verglichen, dann sind sie nicht gleich - hier ist das Ergebnis 100, weil es keine Überschneidungen gibt Michael Maduch 76 Image - Abbildung zeigt zwei Bilder, wo der Vergleich ein “sehr nah” (0.0) für globale Farben ergibt Michael Maduch 77 Image - Abbildung zeigt zwei Bilder, wo der Vergleich ein “sehr nah” (0.02461) für lokale Farbe ergibt Michael Maduch 78 Image - Textur und Struktur - Bilder, die komplette Texturen haben, z.B. Marmor oder Steine, sind allgemein schwer mit Hilfe von Schlüsselworten zu katalogisieren, weil das Vokabular für Texturen begrenzt ist - Texturen können allein (ohne Farben) oder aber auch mit kleinen Farbflächen, wie bei Holz oder Stoffmuster, verwendet werden Michael Maduch 79 Image - Abbildung zeigt zwei ähnliche Texturen Michael Maduch 80 Image - eine Struktur wird nicht strikt auf eine bestimmte Größe oder Position beschränkt - aber Objekte von gleicher Größe oder Position sind ähnlicher als Objekte in verschiedenen Größen - Strukturen sind nützlich um Objekte zu erfassen, wie die Horizontlinie einer Landschaft, rechteckigen Strukturen an Gebäuden oder organische Strukturen bei Bäumen - eine Struktur ist sehr nützlich zur Abfrage einfacher Formen, wie Kreise oder Rechtecke, besonders wenn das gesucht Bild von Hand gezeichnet wurde und Farben nicht so von Bedeutung sind Michael Maduch 81 Image - Abbildung zeigt zwei Bilder, die “sehr nah” in Bezug auf die Struktur sind Michael Maduch 82 Image - Gesichtserkennung - Visual Information Retrieval unterstützt die Gesichtserkennungssoftware von Viisage Technology, Inc. - Dieses Programm analysiert Bilder von Gesichtern und generiert eine Gesichtssignatur, basierend auf verschiedenen einmaligen biometrischen Charakteristika - Nach der Erzeugung der Signatur kann man die Methoden Convert(), VIRScoure() und VIRSimilar(), um Bilder zu vergleichen Michael Maduch 83 Image - wenn Bilder verglichen werden sollen, müssen die visuellen Eigenschaften ein “Gewicht” erhalten - damit errechnet Visual Information Retrieval ein Ähnlichkeitsmaß für jede visuelle Eigenschaft - jedes Gewicht repräsentiert, wie empfindlich der Vergleichsprozeß sein soll, z.B. sehr ähnlich, wenig ähnlich oder gar nicht ähnlich - mit den Gewichten wird ein sogenannter “Score” bzw. die Entfernung zwischen zwei Bilder ermittelt - der Score reicht von 0 (keine Unterschiede) bis 100 ( sehr viele Unterschiede) Michael Maduch 84 Image - Beispiele Create a New Table Containing an Image SQL> CREATE TABLE stockphotos (photo_id NUMBER, photographer VARCHAR2(64), annotation VARCHAR2(255), photo ORDSYS.ORDVir); Ergebnis: Column Name Null? Type ----------------------------------------------------------------------------------------PHOTO_ID NUMBER PHOTOGRAPHER VARCHAR2(64) ANNOTATION VARCHAR2(255) PHOTO ADT(2880) Michael Maduch 85 Image Add an Image Column to an Existing Table ALTER TABLE stockphotos ADD (photo ORDSYS.ORDVir); Retrieve an Image (Simple Read) DECLARE image ORDSYS.ORDVIR; myid INTEGER; BEGIN -- Select the desired photograph from the stockphotos table. SELECT photo INTO image FROM stockphotos WHERE photo_id = myid; END; Michael Maduch 86 Image Retrieve Images Similar to a Comparison Image - Global color: 0.2 - Local color: 0.3 - Texture: 0.1 - Structure: 0.4 DECLARE threshold compare_sig compare_img photo_id photographer annotation photo Michael Maduch NUMBER; RAW(2000); ORDSYS.ORDVir; NUMBER; VARCHAR2(64); VARCHAR2(255); ORDSYS.ORDVIR; 87 Image -- Define cursor for matching. Set weights for the visual attributes. CURSOR getphotos IS SELECT photo_id, photographer, annotation, photo FROM stockphotos T WHERE ORDSYS.VIRSimilar(T.photo.Signature, compare_sig, ’globalcolor="0.2" localcolor="0.3" texture="0.1" structure="0.4"’, threshold)=1; BEGIN -- Create BLOB object SELECT s.photo INTO compare_img FROM stockphotos s WHERE photo_id = 1; -- Generate signature of comparison image, which resides in compare_img. compare_img.Analyze; compare_sig:= compare_img.signature; Michael Maduch 88 Image -- Set the threshold value. threshold := 25; -- Retrieve rows for matching images OPEN getphotos; LOOP FETCH getphotos INTO photo_id, photographer, annotation, photo; EXIT WHEN getphotos%NOTFOUND; -- Display or store the results. . . END LOOP; CLOSE getphotos; END; Michael Maduch 89 - Quellen - Oracle8i interMedia audio, image and video User´s Guide and Reference - Oracle8i Visual Information Retrieval User´s Guid and Reference Michael Maduch 90