-static int __image_360_check(const char *path)
-{
- FILE *fp = NULL;
- size_t size = 0, app1_size = 0, exif_app1_xmp_size = 0;
- unsigned char exif_header[4] = {0, };
- unsigned char exif_app1[2] = {0, };
- unsigned char exif_app1_xmp[2] = {0, };
- unsigned char exif_app1_xmp_t[2] = {0, };
- GString *xmp_data = NULL;
- int fdata = 0;
- int result = 0;
-
- memset(exif_header, 0x00, sizeof(exif_header));
- memset(exif_app1, 0x00, sizeof(exif_app1));
- memset(exif_app1_xmp, 0x00, sizeof(exif_app1_xmp));
- memset(exif_app1_xmp_t, 0x00, sizeof(exif_app1_xmp_t));
-
- fp = fopen(path, "rb");
- if (fp == NULL)
- goto ERROR;
-
- size = fread(exif_header, 1, sizeof(exif_header), fp);
- if (size != sizeof(exif_header))
- goto ERROR;
-
- if ((exif_header[0] == 0xff) && (exif_header[1] == 0xd8) && (exif_header[2] == 0xff) && (exif_header[3] == 0xe1)) {
- size = fread(exif_app1, 1, sizeof(exif_app1), fp);
- if (size != sizeof(exif_app1))
- goto ERROR;
-
- if ((size_t)((exif_app1[0] << 8) | (exif_app1[1])) <= 2)
- goto ERROR;
-
- app1_size = (size_t)((exif_app1[0] << 8) | (exif_app1[1])) - 2 ;
- if (fseek(fp, app1_size, SEEK_CUR) != 0)
- goto ERROR;
-
- size = fread(exif_app1_xmp, 1, sizeof(exif_app1_xmp), fp);
- if (size != sizeof(exif_app1_xmp))
- goto ERROR;
-
- if ((exif_app1_xmp[0] == 0xff) && (exif_app1_xmp[1] == 0xe1)) {
- size = fread(exif_app1_xmp_t, 1, sizeof(exif_app1_xmp_t), fp);
- if (size != sizeof(exif_app1_xmp_t))
- goto ERROR;
-
- if ((size_t)((exif_app1_xmp_t[0] << 8) | (exif_app1_xmp_t[1])) <= 2)
- goto ERROR;
-
- exif_app1_xmp_size = (size_t)((exif_app1_xmp_t[0] << 8) | (exif_app1_xmp_t[1])) - 2;
-
- xmp_data = g_string_sized_new(exif_app1_xmp_size);
-
- do {
- exif_app1_xmp_size--;
- fdata = fgetc(fp);
- if (fdata == EOF)
- continue;
- if (fdata == '\0')
- continue;
-
- xmp_data = g_string_append_c(xmp_data, (gchar)fdata);
- } while (exif_app1_xmp_size > 0);
-
- if (strstr(xmp_data->str, "UsePanoramaViewer") &&
- strstr(xmp_data->str, "True") &&
- strstr(xmp_data->str, "ProjectionType") &&
- strstr(xmp_data->str, "equirectangular"))
- result = 1;
-
- g_string_free(xmp_data, TRUE);
- }
- }
-
-ERROR:
- if (fp) {
- fclose(fp);
- fp = NULL;
- }
-
- return result;
-}
-