Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (8)
......@@ -212,44 +212,14 @@ static int OpenDecoder(vlc_object_t *p_this)
typedef unsigned int uint;
typedef unsigned short ushort;
LOCAL( unsigned short )
de_get16( void * ptr, uint endian ) {
unsigned short val;
memcpy( &val, ptr, sizeof( val ) );
if ( endian == G_BIG_ENDIAN )
{
#ifndef WORDS_BIGENDIAN
val = bswap16( val );
#endif
}
else
{
#ifdef WORDS_BIGENDIAN
val = bswap16( val );
#endif
}
return val;
static uint16_t
de_get16( const void * ptr, uint endian ) {
return (endian == G_BIG_ENDIAN) ? GetWBE(ptr) : GetWLE(ptr);
}
LOCAL( unsigned int )
de_get32( void * ptr, uint endian ) {
unsigned int val;
memcpy( &val, ptr, sizeof( val ) );
if ( endian == G_BIG_ENDIAN )
{
#ifndef WORDS_BIGENDIAN
val = bswap32( val );
#endif
}
else
{
#ifdef WORDS_BIGENDIAN
val = bswap32( val );
#endif
}
return val;
static uint32_t
de_get32( const void * ptr, uint endian ) {
return (endian == G_BIG_ENDIAN) ? GetDWBE(ptr) : GetDWLE(ptr);
}
static bool getRDFFloat(const char *psz_rdf, float *out, const char *psz_var)
......@@ -284,42 +254,31 @@ static bool getRDFFloat(const char *psz_rdf, float *out, const char *psz_var)
/* read XMP metadata for projection according to
* https://developers.google.com/streetview/spherical-metadata */
static void jpeg_GetProjection(j_decompress_ptr cinfo, video_format_t *fmt)
static bool jpeg_ParseXMP(const uint8_t *p_buf, size_t i_buf,
video_format_t *fmt)
{
jpeg_saved_marker_ptr xmp_marker = NULL;
jpeg_saved_marker_ptr cmarker = cinfo->marker_list;
while (cmarker)
{
if (cmarker->marker == EXIF_JPEG_MARKER)
{
if(cmarker->data_length >= 32 &&
!memcmp(cmarker->data, EXIF_XMP_STRING, 29))
{
xmp_marker = cmarker;
break;
}
}
cmarker = cmarker->next;
}
if(i_buf < 29)
return false;
if (xmp_marker == NULL)
return;
char *psz_rdf = malloc(xmp_marker->data_length - 29 + 1);
/* Allocate temp, zero terminated buffer */
/* Fixme: custom memicmp */
/* or Fixme: Who's not compliant to XML attributes case ? */
char *psz_rdf = malloc(i_buf - 29 + 1);
if (unlikely(psz_rdf == NULL))
return;
memcpy(psz_rdf, xmp_marker->data + 29, xmp_marker->data_length - 29);
psz_rdf[xmp_marker->data_length - 29] = '\0';
return false;
memcpy(psz_rdf, p_buf + 29, i_buf - 29);
psz_rdf[i_buf - 29] = '\0';
if (!strcasestr(psz_rdf, "ProjectionType=\"equirectangular\"") &&
!strcasestr(psz_rdf, "ProjectionType>equirectangular"))
return false;
/* Try to find the string "GSpherical:Spherical" because the v1
spherical video spec says the tag must be there. */
if (strcasestr(psz_rdf, "ProjectionType=\"equirectangular\"") ||
strcasestr(psz_rdf, "ProjectionType>equirectangular"))
fmt->projection_mode = PROJECTION_MODE_EQUIRECTANGULAR;
fmt->projection_mode = PROJECTION_MODE_EQUIRECTANGULAR;
/* pose handling */
float value;
if (getRDFFloat(psz_rdf, &value, "PoseHeadingDegrees"))
if (getRDFFloat(psz_rdf, &value, "PoseHeadingDegrees") &&
value >= 0.f && value <= 360.f)
fmt->pose.yaw = value;
if (getRDFFloat(psz_rdf, &value, "PosePitchDegrees"))
......@@ -338,23 +297,40 @@ static void jpeg_GetProjection(j_decompress_ptr cinfo, video_format_t *fmt)
if (getRDFFloat(psz_rdf, &value, "InitialViewRollDegrees"))
fmt->pose.roll = value;
if (getRDFFloat(psz_rdf, &value, "InitialHorizontalFOVDegrees"))
if (getRDFFloat(psz_rdf, &value, "InitialHorizontalFOVDegrees") &&
value >= FIELD_OF_VIEW_DEGREES_MIN && value <= FIELD_OF_VIEW_DEGREES_MAX)
fmt->pose.fov = value;
free(psz_rdf);
return true;
}
static void jpeg_FillProjection(j_decompress_ptr cinfo, video_format_t *fmt)
{
for (jpeg_saved_marker_ptr cmarker = cinfo->marker_list;
cmarker != NULL;
cmarker = cmarker->next)
{
if(cmarker->marker == EXIF_JPEG_MARKER &&
cmarker->data_length >= 32 &&
!memcmp(cmarker->data, EXIF_XMP_STRING, 29) &&
jpeg_ParseXMP(cmarker->data, cmarker->data_length, fmt))
break; /* found projection marker */
}
}
/*
* Look through the meta data in the libjpeg decompress structure to determine
* if an EXIF Orientation tag is present. If so return its value (1-8),
* otherwise return 0
* if an EXIF Orientation tag is present. If so return true and sets orientation
* value (1-8), otherwise return false
*
* This function is based on the function get_orientation in io-jpeg.c, part of
* the GdkPixbuf library, licensed under LGPLv2+.
* Copyright (C) 1999 Michael Zucchi, The Free Software Foundation
*/
LOCAL( int )
jpeg_GetOrientation( j_decompress_ptr cinfo )
#define EXIF_IDENT_STRING "Exif\0" /* Exif\000\000 */
static bool jpeg_ParseExifApp1( const uint8_t *p_buf, size_t i_buf, int *orientation )
{
uint i; /* index into working buffer */
......@@ -367,37 +343,13 @@ jpeg_GetOrientation( j_decompress_ptr cinfo )
uint tiff = 0; /* offset to active tiff header */
uint endian = 0; /* detected endian of data */
jpeg_saved_marker_ptr exif_marker; /* Location of the Exif APP1 marker */
jpeg_saved_marker_ptr cmarker; /* Location to check for Exif APP1 marker */
const char leth[] = { 0x49, 0x49, 0x2a, 0x00 }; /* Little endian TIFF header */
const char beth[] = { 0x4d, 0x4d, 0x00, 0x2a }; /* Big endian TIFF header */
#define EXIF_IDENT_STRING "Exif\000\000"
#define EXIF_ORIENT_TAGID 0x112
/* check for Exif marker (also called the APP1 marker) */
exif_marker = NULL;
cmarker = cinfo->marker_list;
while ( cmarker )
{
if ( cmarker->data_length >= 32 &&
cmarker->marker == EXIF_JPEG_MARKER )
{
/* The Exif APP1 marker should contain a unique
identification string ("Exif\0\0"). Check for it. */
if ( !memcmp( cmarker->data, EXIF_IDENT_STRING, 6 ) )
{
exif_marker = cmarker;
}
}
cmarker = cmarker->next;
}
/* Did we find the Exif APP1 marker? */
if ( exif_marker == NULL )
return 0;
if (i_buf < 32)
return false;
/* Check for TIFF header and catch endianness */
i = 0;
......@@ -420,13 +372,13 @@ jpeg_GetOrientation( j_decompress_ptr cinfo )
while ( i < 16 )
{
/* Little endian TIFF header */
if ( memcmp( &exif_marker->data[i], leth, 4 ) == 0 )
if ( memcmp( &p_buf[i], leth, 4 ) == 0 )
{
endian = G_LITTLE_ENDIAN;
}
/* Big endian TIFF header */
else
if ( memcmp( &exif_marker->data[i], beth, 4 ) == 0 )
if ( memcmp( &p_buf[i], beth, 4 ) == 0 )
{
endian = G_BIG_ENDIAN;
}
......@@ -443,53 +395,70 @@ jpeg_GetOrientation( j_decompress_ptr cinfo )
/* So did we find a TIFF header or did we just hit end of buffer? */
if ( tiff == 0 )
return 0;
return false;
/* Read out the offset pointer to IFD0 */
offset = de_get32( &exif_marker->data[i] + 4, endian );
offset = de_get32( &p_buf[i] + 4, endian );
i = i + offset;
/* Check that we still are within the buffer and can read the tag count */
if ( i > exif_marker->data_length - 2 )
return 0;
if ( i > i_buf - 2 )
return false;
/* Find out how many tags we have in IFD0. As per the TIFF spec, the first
two bytes of the IFD contain a count of the number of tags. */
tags = de_get16( &exif_marker->data[i], endian );
tags = de_get16( &p_buf[i], endian );
i = i + 2;
/* Check that we still have enough data for all tags to check. The tags
are listed in consecutive 12-byte blocks. The tag ID, type, size, and
a pointer to the actual value, are packed into these 12 byte entries. */
if ( tags * 12U > exif_marker->data_length - i )
return 0;
if ( tags * 12U > i_buf - i )
return false;
/* Check through IFD0 for tags of interest */
while ( tags-- )
{
tag_type = de_get16( &exif_marker->data[i], endian );
tag_type = de_get16( &p_buf[i], endian );
/* Is this the orientation tag? */
if ( tag_type == EXIF_ORIENT_TAGID )
{
type = de_get16( &exif_marker->data[i + 2], endian );
count = de_get32( &exif_marker->data[i + 4], endian );
type = de_get16( &p_buf[i + 2], endian );
count = de_get32( &p_buf[i + 4], endian );
/* Check that type and count fields are OK. The orientation field
will consist of a single (count=1) 2-byte integer (type=3). */
if ( type != 3 || count != 1 )
return 0;
return false;
/* Return the orientation value. Within the 12-byte block, the
pointer to the actual data is at offset 8. */
ret = de_get16( &exif_marker->data[i + 8], endian );
return ( ret <= 8 ) ? ret : 0;
ret = de_get16( &p_buf[i + 8], endian );
*orientation = ( ret <= 8 ) ? ret : 0;
return true;
}
/* move the pointer to the next 12-byte tag field. */
i = i + 12;
}
return 0; /* No EXIF Orientation tag found */
return false; /* No EXIF Orientation tag found */
}
static int jpeg_GetOrientation( j_decompress_ptr cinfo )
{
int orientation = 0;
for (jpeg_saved_marker_ptr cmarker = cinfo->marker_list;
cmarker != NULL;
cmarker = cmarker->next)
{
if(cmarker->marker == EXIF_JPEG_MARKER &&
cmarker->data_length >= 32 &&
!memcmp(cmarker->data, EXIF_IDENT_STRING, sizeof(EXIF_IDENT_STRING)) &&
jpeg_ParseExifApp1(cmarker->data, cmarker->data_length, &orientation))
break; /* found orientation marker */
}
return orientation;
}
/*
......@@ -539,7 +508,7 @@ static int DecodeBlock(decoder_t *p_dec, block_t *p_block)
msg_Dbg( p_dec, "Jpeg orientation is %d", i_otag );
p_dec->fmt_out.video.orientation = ORIENT_FROM_EXIF( i_otag );
}
jpeg_GetProjection(&p_sys->p_jpeg, &p_dec->fmt_out.video);
jpeg_FillProjection(&p_sys->p_jpeg, &p_dec->fmt_out.video);
/* Get a new picture */
if (decoder_UpdateVideoFormat(p_dec))
......
......@@ -377,9 +377,9 @@ static bool IsPnm(stream_t *s)
return true;
}
static uint8_t FindJpegMarker(int *position, const uint8_t *data, int size)
static uint8_t FindJpegMarker(size_t *position, const uint8_t *data, size_t size)
{
for (int i = *position; i + 1 < size; i++) {
for (size_t i = *position; i + 1 < size; i++) {
if (data[i + 0] != 0xff || data[i + 1] == 0x00)
return 0xff;
if (data[i + 1] != 0xff) {
......@@ -392,8 +392,11 @@ static uint8_t FindJpegMarker(int *position, const uint8_t *data, int size)
static bool IsJfif(stream_t *s)
{
const uint8_t *header;
int size = vlc_stream_Peek(s, &header, 256);
int position = 0;
ssize_t peek = vlc_stream_Peek(s, &header, 256);
if(peek < 256)
return false;
size_t size = (size_t) peek;
size_t position = 0;
if (FindJpegMarker(&position, header, size) != 0xd8)
return false;
......@@ -435,24 +438,29 @@ static bool IsSpiff(stream_t *s)
return true;
}
static bool IsExif(stream_t *s)
#define EXIF_STRING "Exif" /* includes \0 */
#define EXIF_XMP_STRING "http://ns.adobe.com/xap/1.0/" /* includes \0 */
static bool IsExifXMP(stream_t *s)
{
const uint8_t *header;
ssize_t size = vlc_stream_Peek(s, &header, 256);
if (size == -1)
ssize_t peek = vlc_stream_Peek(s, &header, 256);
if (peek < 256)
return false;
int position = 0;
size_t size = (size_t) peek;
size_t position = 0;
if (FindJpegMarker(&position, header, size) != 0xd8)
return false;
if (FindJpegMarker(&position, header, size) != 0xe1)
return false;
position += 2; /* Skip size */
if (position + 5 > size)
return false;
if (memcmp(&header[position], "Exif\0", 5))
return false;
return true;
if (position + sizeof(EXIF_STRING) <= size &&
!memcmp(&header[position], EXIF_STRING, sizeof(EXIF_STRING)))
return true;
if (position + sizeof(EXIF_XMP_STRING) <= size &&
!memcmp(&header[position], EXIF_XMP_STRING, sizeof(EXIF_XMP_STRING)))
return true;
return false;
}
static bool FindSVGmarker(int *position, const uint8_t *data, const int size, const char *marker)
......@@ -620,7 +628,7 @@ static const image_format_t formats[] = {
.detect = IsSpiff,
},
{ .codec = VLC_CODEC_JPEG,
.detect = IsExif,
.detect = IsExifXMP,
},
{ .codec = VLC_CODEC_WEBP,
.detect = IsWebP,
......