annotate h264dec.c @ 2:897f711a7157

rearrange to work with autoconf
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 25 Sep 2012 15:55:33 +0200
parents
children 0b056460c67d
rev   line source
nengel@2 1 /*
nengel@2 2 * H264 decoder main
nengel@2 3 */
nengel@2 4
nengel@2 5 #include "config.h"
nengel@2 6 #include "libavcodec/h264.h"
nengel@2 7
nengel@2 8 #include <string.h>
nengel@2 9 #include <stdlib.h>
nengel@2 10 #include <errno.h>
nengel@2 11 #include <signal.h>
nengel@2 12 #include <unistd.h>
nengel@2 13 #include <getopt.h>
nengel@2 14 #include <fcntl.h>
nengel@2 15
nengel@2 16 #include <sys/types.h>
nengel@2 17 #include <sys/time.h>
nengel@2 18 #include <sys/resource.h>
nengel@2 19 #include <time.h>
nengel@2 20
nengel@2 21 #include <assert.h>
nengel@2 22
nengel@2 23
nengel@2 24 static const char program_name[] = "h264dec";
nengel@2 25 static const int program_birth_year = 2010;
nengel@2 26
nengel@2 27 static const char *file_name;
nengel@2 28 static int ifile, ofile;
nengel@2 29 static int no_arch =0;
nengel@2 30 static int parallel = 1;
nengel@2 31 static int frame_width = 0;
nengel@2 32 static int frame_height = 0;
nengel@2 33
nengel@2 34 static void av_exit(int ret)
nengel@2 35 {
nengel@2 36 //do some free calls
nengel@2 37 #undef exit
nengel@2 38 exit(ret);
nengel@2 39 }
nengel@2 40
nengel@2 41 static void opt_input_file(const char *filename)
nengel@2 42 {
nengel@2 43 /* open the input file */
nengel@2 44 ifile = open(filename, O_RDONLY, 0666);
nengel@2 45 if (ifile < 0){
nengel@2 46 fprintf(stderr, "Failed to open %s\n", filename);
nengel@2 47 av_exit(-1);
nengel@2 48 }
nengel@2 49
nengel@2 50 //parse first frame to get resolution (other information available but not used)
nengel@2 51 H264Slice slice;
nengel@2 52 PictureInfo pi;
nengel@2 53 GetBitContext gb = {0,};
nengel@2 54 ParserContext *pc;
nengel@2 55 NalContext *nc;
nengel@2 56
nengel@2 57 pc = get_parse_context(ifile);
nengel@2 58 nc = get_nal_context(0, 0);
nengel@2 59
nengel@2 60 memset(&slice, 0, sizeof(H264Slice));
nengel@2 61 slice.current_picture_info=&pi;
nengel@2 62
nengel@2 63 av_read_frame_internal(pc, &gb);
nengel@2 64 decode_nal_units(nc, &slice, &gb);
nengel@2 65
nengel@2 66 frame_width = nc->width;
nengel@2 67 frame_height= nc->height;
nengel@2 68
nengel@2 69 //clean up
nengel@2 70 av_freep(&gb.raw);
nengel@2 71 if (gb.rbsp)
nengel@2 72 av_freep(&gb.rbsp);
nengel@2 73 free_parse_context(pc);
nengel@2 74 free_nal_context(nc);
nengel@2 75
nengel@2 76 //rewind file
nengel@2 77 int offset;
nengel@2 78 if ( (offset=lseek(ifile, 0, SEEK_SET)) ){
nengel@2 79 fprintf(stderr, "Rewind input file %s failed at offset %d\n", filename, offset);
nengel@2 80 }
nengel@2 81
nengel@2 82 }
nengel@2 83
nengel@2 84 static void opt_output_file(const char *filename)
nengel@2 85 {
nengel@2 86 if (filename){
nengel@2 87 if (!strcmp(filename, "-"))
nengel@2 88 filename = "pipe:";
nengel@2 89
nengel@2 90 ofile = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0666);
nengel@2 91 }else{
nengel@2 92 ofile =0;
nengel@2 93 }
nengel@2 94 }
nengel@2 95
nengel@2 96 static void show_usage(void)
nengel@2 97 {
nengel@2 98 printf("usage: ffmpeg [options] -i infile }...\n");
nengel@2 99 printf("\n");
nengel@2 100 }
nengel@2 101
nengel@2 102 static struct option long_options[] = {
nengel@2 103 {"static-sched", 0, 0, 0},
nengel@2 104 {"static-mbd", 0, 0, 0},
nengel@2 105 {"numamap", 0, 0, 0},
nengel@2 106 {"no-mbd", 0, 0, 0},
nengel@2 107 {"static-3d", 0, 0, 0},
nengel@2 108 {"slice-bufs", 1, 0, 0},
nengel@2 109 {"smt", 0, 0, 0},
nengel@2 110 {"noarch", 0, 0, 'a'},
nengel@2 111 {"display", 0, 0, 'd'},
nengel@2 112 {"fullscreen", 0, 0, 'f'},
nengel@2 113 {"numframes", 1, 0, 'n'},
nengel@2 114 {"use-ppe-ed", 1, 0, 'p'},
nengel@2 115 {"sequential", 0, 0, 's'},
nengel@2 116 {"threads", 1, 0, 't'},
nengel@2 117 {"verbose", 1, 0, 'v'},
nengel@2 118 {"wave-order", 1, 0, 'w'},
nengel@2 119 {"smb-size", 1, 0, 'z'},
nengel@2 120 {"pipe-bufs", 1, 0, 'e'},
nengel@2 121 {0, 0, 0, 0}
nengel@2 122 };
nengel@2 123
nengel@2 124 static h264_options cli_opts;
nengel@2 125 static void parse_cmd(int argc, char **argv)
nengel@2 126 {
nengel@2 127 int c;
nengel@2 128 int digit_optind = 0;
nengel@2 129 int option_index = 0;
nengel@2 130 char ofile_name[1024];
nengel@2 131 extern char *optarg;
nengel@2 132 extern int optind, optopt;
nengel@2 133
nengel@2 134 cli_opts.statsched =0;
nengel@2 135 cli_opts.numamap =0;
nengel@2 136 cli_opts.statmbd =0;
nengel@2 137 cli_opts.no_mbd= 0;
nengel@2 138 cli_opts.numframes = INT_MAX;
nengel@2 139 cli_opts.display=0;
nengel@2 140 cli_opts.fullscreen=0;
nengel@2 141 cli_opts.verbose=0;
nengel@2 142 cli_opts.ppe_ed=0;
nengel@2 143 cli_opts.profile=0;
nengel@2 144 cli_opts.threads = 1;
nengel@2 145 cli_opts.smb_size[0] = cli_opts.smb_size[1] = 1;
nengel@2 146 cli_opts.wave_order=0;
nengel@2 147 cli_opts.static_3d=0;
nengel@2 148 cli_opts.pipe_bufs=8;
nengel@2 149 cli_opts.slice_bufs=1;
nengel@2 150 cli_opts.smt= 0;
nengel@2 151 while ((c = getopt_long(argc, argv, "ade:fi:n:o:p:st:vwz:", long_options, &option_index)) != -1 ){
nengel@2 152 int this_option_optind = optind ? optind : 1;
nengel@2 153
nengel@2 154 switch (c){
nengel@2 155 case 0:
nengel@2 156 if (option_index==0){
nengel@2 157 cli_opts.statsched=1;
nengel@2 158 }else if (option_index==1){
nengel@2 159 cli_opts.statmbd= 1;
nengel@2 160 }else if (option_index==2){
nengel@2 161 cli_opts.numamap= 1;
nengel@2 162 }else if (option_index==3){
nengel@2 163 cli_opts.no_mbd= 1;
nengel@2 164 }else if (option_index==4){
nengel@2 165 cli_opts.static_3d= 1;
nengel@2 166 }else if (option_index==5){
nengel@2 167 cli_opts.slice_bufs= (unsigned) atoi(optarg);
nengel@2 168 }else if (option_index==6){
nengel@2 169 cli_opts.smt= 1;
nengel@2 170 }
nengel@2 171 break;
nengel@2 172 case '0':
nengel@2 173 case '1':
nengel@2 174 case '2':
nengel@2 175 if (digit_optind != 0 && digit_optind != this_option_optind)
nengel@2 176 printf("digits occur in two different argv-elements.\n");
nengel@2 177 digit_optind = this_option_optind;
nengel@2 178 printf("option %c\n", c);
nengel@2 179 break;
nengel@2 180 case 'a':
nengel@2 181 no_arch=1;
nengel@2 182 break;
nengel@2 183 case 'd':
nengel@2 184 cli_opts.display=1;
nengel@2 185 break;
nengel@2 186 case 'f':
nengel@2 187 cli_opts.fullscreen=1;
nengel@2 188 break;
nengel@2 189 case 'i':
nengel@2 190 file_name = (const char *)optarg;
nengel@2 191 opt_input_file(file_name);
nengel@2 192 break;
nengel@2 193 case 'n':
nengel@2 194 cli_opts.numframes = (unsigned) atoi(optarg);
nengel@2 195 break;
nengel@2 196 case 'o':
nengel@2 197 strcpy(ofile_name, optarg);
nengel@2 198 opt_output_file(ofile_name);
nengel@2 199 break;
nengel@2 200 case 'p':
nengel@2 201 cli_opts.profile = (unsigned) atoi(optarg);
nengel@2 202 break;
nengel@2 203 case 's':
nengel@2 204 cli_opts.threads = 0;
nengel@2 205 parallel = 0;
nengel@2 206 break;
nengel@2 207 case 't':
nengel@2 208 cli_opts.threads = atoi(optarg);
nengel@2 209 if (cli_opts.threads<=0){
nengel@2 210 fprintf(stderr, "Option -%c requires thread numbers > 0\n", c);
nengel@2 211 av_exit(-1);
nengel@2 212 }
nengel@2 213 break;
nengel@2 214 case 'v':
nengel@2 215 cli_opts.verbose = 1;
nengel@2 216 break;
nengel@2 217 case 'w':
nengel@2 218 cli_opts.wave_order = 1;
nengel@2 219 break;
nengel@2 220 case 'z': // only useful in ompss
nengel@2 221 if (argc < optind +1){
nengel@2 222 fprintf(stderr, "Option -%c (--smb-size) requires 2 arguments\n", c);
nengel@2 223 av_exit(-1);
nengel@2 224 }
nengel@2 225 optind--;
nengel@2 226 for (int i=0; i<2; i++){
nengel@2 227 cli_opts.smb_size[i] = atoi(argv[optind++]);
nengel@2 228 if (!(cli_opts.smb_size > 0)){
nengel@2 229 fprintf(stderr, "Option -%c (--smb-size) requires dimensions > 0\n", c);
nengel@2 230 av_exit(-1);
nengel@2 231 }
nengel@2 232 }
nengel@2 233 break;
nengel@2 234 case 'e':
nengel@2 235 cli_opts.pipe_bufs = atoi(optarg);
nengel@2 236 break;
nengel@2 237 case ':':
nengel@2 238 fprintf(stderr, "Option -%c requires an operand\n", optopt);
nengel@2 239 av_exit(-1);
nengel@2 240 break;
nengel@2 241 case '?':
nengel@2 242 fprintf(stderr, "Unrecognized option: -%c\n", optopt);
nengel@2 243 av_exit(-1);
nengel@2 244 break;
nengel@2 245 }
nengel@2 246 }
nengel@2 247
nengel@2 248 }
nengel@2 249
nengel@2 250 int main(int argc, char **argv)
nengel@2 251 {
nengel@2 252 /* parse options */
nengel@2 253 parse_cmd(argc, argv);
nengel@2 254
nengel@2 255 if(!ifile ) {
nengel@2 256 show_usage();
nengel@2 257 av_exit(1);
nengel@2 258 }
nengel@2 259
nengel@2 260 H264Context *h = get_h264dec_context(file_name, ifile, ofile, frame_width, frame_height, &cli_opts);
nengel@2 261 #if OMPSS
nengel@2 262 if (h264_decode_ompss( h ) < 0)
nengel@2 263 av_exit(-1);
nengel@2 264 #else
nengel@2 265 if (parallel){
nengel@2 266 if (ARCH_CELL && !no_arch){
nengel@2 267 if (h264_decode_cell( h ) < 0)
nengel@2 268 av_exit(-1);
nengel@2 269 }else{
nengel@2 270 if (h264_decode_pthread( h ) < 0)
nengel@2 271 av_exit(1);
nengel@2 272 }
nengel@2 273 }else{
nengel@2 274 if (ARCH_CELL && !no_arch){
nengel@2 275 if (h264_decode_cell_seq( h ) < 0)
nengel@2 276 av_exit(1);
nengel@2 277 }else{
nengel@2 278 if (h264_decode_seq( h ) < 0)
nengel@2 279 av_exit(1);
nengel@2 280 }
nengel@2 281 }
nengel@2 282 #endif
nengel@2 283 free_h264dec_context(h);
nengel@2 284 close(ifile);
nengel@2 285 close(ofile);
nengel@2 286
nengel@2 287 return 0;
nengel@2 288 }