Blender  V3.3
avi_options.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
11 #include "AVI_avi.h"
12 #include "BLI_fileops.h"
13 #include "avi_endian.h"
14 #include "avi_intern.h"
15 
16 #ifdef WIN32
17 # include "BLI_winstuff.h"
18 #endif
19 
20 /* avi_set_compress_options gets its own file... now don't WE feel important? */
21 
23  AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data)
24 {
25  int i;
26  int useconds;
27 
28  (void)stream; /* unused */
29 
30  if (movie->header->TotalFrames != 0) {
31  /* Can't change params after we have already started writing frames. */
32  return AVI_ERROR_OPTION;
33  }
34 
35  switch (option_type) {
37  switch (option) {
38  case AVI_OPTION_WIDTH:
39  movie->header->Width = *((int *)opt_data);
40  movie->header->SuggestedBufferSize = movie->header->Width * movie->header->Height * 3;
41 
42  for (i = 0; i < movie->header->Streams; i++) {
43  if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) {
44  ((AviBitmapInfoHeader *)movie->streams[i].sf)->Width = *((int *)opt_data);
46  movie->streams[i].sh.right = *((int *)opt_data);
47  ((AviBitmapInfoHeader *)movie->streams[i].sf)->SizeImage =
49  BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET);
50  awrite(movie,
51  movie->streams[i].sf,
52  1,
53  movie->streams[i].sf_size,
54  movie->fp,
55  AVI_BITMAPH);
56  }
57  }
58 
59  break;
60 
61  case AVI_OPTION_HEIGHT:
62  movie->header->Height = *((int *)opt_data);
63  movie->header->SuggestedBufferSize = movie->header->Width * movie->header->Height * 3;
64 
65  for (i = 0; i < movie->header->Streams; i++) {
66  if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) {
67  ((AviBitmapInfoHeader *)movie->streams[i].sf)->Height = *((int *)opt_data);
69  movie->streams[i].sh.bottom = *((int *)opt_data);
70  ((AviBitmapInfoHeader *)movie->streams[i].sf)->SizeImage =
72  BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET);
73  awrite(movie,
74  movie->streams[i].sf,
75  1,
76  movie->streams[i].sf_size,
77  movie->fp,
78  AVI_BITMAPH);
79  }
80  }
81 
82  break;
83 
84  case AVI_OPTION_QUALITY:
85  for (i = 0; i < movie->header->Streams; i++) {
86  if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) {
87  movie->streams[i].sh.Quality = (*((int *)opt_data)) * 100;
88  BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET);
89  awrite(movie,
90  movie->streams[i].sf,
91  1,
92  movie->streams[i].sf_size,
93  movie->fp,
94  AVI_BITMAPH);
95  }
96  }
97  break;
98 
100  useconds = (int)(1000000 / (*((double *)opt_data)));
101  if (useconds) {
102  movie->header->MicroSecPerFrame = useconds;
103  }
104 
105  for (i = 0; i < movie->header->Streams; i++) {
106  if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) {
107  movie->streams[i].sh.Scale = movie->header->MicroSecPerFrame;
108  BLI_fseek(movie->fp, movie->offset_table[1 + i * 2 + 1], SEEK_SET);
109  awrite(movie,
110  movie->streams[i].sf,
111  1,
112  movie->streams[i].sf_size,
113  movie->fp,
114  AVI_BITMAPH);
115  }
116  }
117  break;
118  }
119 
120  BLI_fseek(movie->fp, movie->offset_table[0], SEEK_SET);
121  awrite(movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH);
122 
123  break;
125  break;
127  break;
128  default:
129  return AVI_ERROR_OPTION;
130  }
131 
132  return AVI_ERROR_NONE;
133 }
#define FCC(ch4)
Definition: AVI_avi.h:215
AviError
Definition: AVI_avi.h:185
@ AVI_ERROR_OPTION
Definition: AVI_avi.h:194
@ AVI_ERROR_NONE
Definition: AVI_avi.h:186
#define AVI_OPTION_TYPE_STRF
Definition: AVI_avi.h:251
AviOption
Definition: AVI_avi.h:198
@ AVI_OPTION_HEIGHT
Definition: AVI_avi.h:200
@ AVI_OPTION_FRAMERATE
Definition: AVI_avi.h:202
@ AVI_OPTION_WIDTH
Definition: AVI_avi.h:199
@ AVI_OPTION_QUALITY
Definition: AVI_avi.h:201
#define AVI_OPTION_TYPE_STRH
Definition: AVI_avi.h:247
#define AVI_OPTION_TYPE_MAIN
Definition: AVI_avi.h:243
File and directory operations.
int BLI_fseek(FILE *stream, int64_t offset, int whence)
Definition: storage.c:160
Compatibility-like things for windows.
int avi_get_format_type(AviFormat format)
Definition: avi_codecs.c:83
void awrite(AviMovie *movie, void *datain, int block, int size, FILE *fp, int type)
Definition: avi_endian.c:133
#define AVI_MAINH
Definition: avi_endian.h:15
#define AVI_BITMAPH
Definition: avi_endian.h:17
AviError AVI_set_compress_option(AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data)
Definition: avi_options.c:22
SyclQueue void void size_t num_bytes void
int MicroSecPerFrame
Definition: AVI_avi.h:45
int SuggestedBufferSize
Definition: AVI_avi.h:65
int TotalFrames
Definition: AVI_avi.h:62
int64_t * offset_table
Definition: AVI_avi.h:178
FILE * fp
Definition: AVI_avi.h:163
AviMainHeader * header
Definition: AVI_avi.h:171
AviStreamRec * streams
Definition: AVI_avi.h:172
int SuggestedBufferSize
Definition: AVI_avi.h:92
short bottom
Definition: AVI_avi.h:98
AviFormat format
Definition: AVI_avi.h:159
AviStreamHeader sh
Definition: AVI_avi.h:156
void * sf
Definition: AVI_avi.h:157