@ @ requires buffer_size >= 0x78+7; @ requires separation: \separated(&file_hint_ogg, buffer+(..), file_recovery, file_recovery_new); @ requires valid_header_check_param(buffer, buffer_size, safe_header_only, file_recovery, file_recovery_new); @ ensures valid_header_check_result(\result, file_recovery_new); @*/
| 106 | @ ensures valid_header_check_result(\result, file_recovery_new); |
| 107 | @*/ |
| 108 | static int header_check_ogg(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) |
| 109 | { |
| 110 | static const unsigned char sign_theora[7]= {0x80, 't', 'h', 'e', 'o', 'r', 'a'}; |
| 111 | /* http://en.wikipedia.org/wiki/Ogg#File_format */ |
| 112 | /* Return if not Beginning Of Stream and already saving the file */ |
| 113 | if((buffer[5]&0x02)!=0x02 && |
| 114 | file_recovery->file_stat!=NULL && |
| 115 | file_recovery->file_check!=NULL && |
| 116 | file_recovery->file_stat->file_hint==&file_hint_ogg) |
| 117 | { |
| 118 | header_ignored(file_recovery_new); |
| 119 | return 0; |
| 120 | } |
| 121 | reset_file_recovery(file_recovery_new); |
| 122 | file_recovery_new->calculated_file_size=0; |
| 123 | if(file_recovery_new->blocksize > 27+255) |
| 124 | { |
| 125 | file_recovery_new->data_check=&data_check_ogg; |
| 126 | file_recovery_new->file_check=&file_check_size; |
| 127 | } |
| 128 | /* Ogg data, Theora video */ |
| 129 | if(memcmp(&buffer[28], sign_theora, sizeof(sign_theora))==0) |
| 130 | file_recovery_new->extension="ogv"; |
| 131 | else if(memcmp(&buffer[0x78], sign_theora, sizeof(sign_theora))==0) |
| 132 | file_recovery_new->extension="ogv"; |
| 133 | else |
| 134 | file_recovery_new->extension=file_hint_ogg.extension; |
| 135 | return 1; |
| 136 | } |
| 137 | |
| 138 | static void register_header_check_ogg(file_stat_t *file_stat) |
| 139 | { |
nothing calls this directly
no test coverage detected