|
|
@@ -2074,6 +2074,30 @@ void *grow_array(void *array, int elem_size, int *size, int new_size) |
|
|
|
return array; |
|
|
|
} |
|
|
|
|
|
|
|
double get_rotation(AVStream *st) |
|
|
|
{ |
|
|
|
AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0); |
|
|
|
uint8_t* displaymatrix = av_stream_get_side_data(st, |
|
|
|
AV_PKT_DATA_DISPLAYMATRIX, NULL); |
|
|
|
double theta = 0; |
|
|
|
|
|
|
|
if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) { |
|
|
|
char *tail; |
|
|
|
theta = av_strtod(rotate_tag->value, &tail); |
|
|
|
if (*tail) |
|
|
|
theta = 0; |
|
|
|
} |
|
|
|
if (displaymatrix && !theta) |
|
|
|
theta = av_display_rotation_get((int32_t*) displaymatrix); |
|
|
|
|
|
|
|
theta -= 360*floor(theta/360 + 0.9/360); |
|
|
|
|
|
|
|
if (fabs(theta - 90*round(theta/90)) > 2) |
|
|
|
av_log_ask_for_sample(NULL, "Odd rotation angle\n"); |
|
|
|
|
|
|
|
return theta; |
|
|
|
} |
|
|
|
|
|
|
|
#if CONFIG_AVDEVICE |
|
|
|
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts) |
|
|
|
{ |
|
|
@@ -2231,28 +2255,4 @@ int show_sinks(void *optctx, const char *opt, const char *arg) |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
double get_rotation(AVStream *st) |
|
|
|
{ |
|
|
|
AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0); |
|
|
|
uint8_t* displaymatrix = av_stream_get_side_data(st, |
|
|
|
AV_PKT_DATA_DISPLAYMATRIX, NULL); |
|
|
|
double theta = 0; |
|
|
|
|
|
|
|
if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) { |
|
|
|
char *tail; |
|
|
|
theta = av_strtod(rotate_tag->value, &tail); |
|
|
|
if (*tail) |
|
|
|
theta = 0; |
|
|
|
} |
|
|
|
if (displaymatrix && !theta) |
|
|
|
theta = av_display_rotation_get((int32_t*) displaymatrix); |
|
|
|
|
|
|
|
theta -= 360*floor(theta/360 + 0.9/360); |
|
|
|
|
|
|
|
if (fabs(theta - 90*round(theta/90)) > 2) |
|
|
|
av_log_ask_for_sample(NULL, "Odd rotation angle\n"); |
|
|
|
|
|
|
|
return theta; |
|
|
|
} |
|
|
|
|
|
|
|
#endif |