00001 #include "../libmpeg3.h"
00002 #include "../mpeg3private.h"
00003 #include "../mpeg3protos.h"
00004 #include "mpeg3video.h"
00005 #include "mpeg3videoprotos.h"
00006 #include <pthread.h>
00007 #include <stdlib.h>
00008
00009
00010
00011
00012
00013 unsigned char mpeg3_zig_zag_scan_nommx[64] =
00014 {
00015 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
00016 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
00017 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
00018 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
00019 };
00020
00021
00022 unsigned char mpeg3_alternate_scan_nommx[64] =
00023 {
00024 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49,
00025 41, 33, 26, 18, 3, 11, 4, 12, 19, 27, 34, 42, 50, 58, 35, 43,
00026 51, 59, 20, 28, 5, 13, 6, 14, 21, 29, 36, 44, 52, 60, 37, 45,
00027 53, 61, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
00028 };
00029
00030
00031 unsigned char mpeg3_default_intra_quantizer_matrix[64] =
00032 {
00033 8, 16, 19, 22, 26, 27, 29, 34,
00034 16, 16, 22, 24, 27, 29, 34, 37,
00035 19, 22, 26, 27, 29, 34, 34, 38,
00036 22, 22, 26, 27, 29, 34, 37, 40,
00037 22, 26, 27, 29, 32, 35, 40, 48,
00038 26, 27, 29, 32, 35, 40, 48, 58,
00039 26, 27, 29, 34, 38, 46, 56, 69,
00040 27, 29, 35, 38, 46, 56, 69, 83
00041 };
00042
00043 unsigned char mpeg3_non_linear_mquant_table[32] =
00044 {
00045 0, 1, 2, 3, 4, 5, 6, 7,
00046 8, 10, 12, 14, 16, 18, 20, 22,
00047 24, 28, 32, 36, 40, 44, 48, 52,
00048 56, 64, 72, 80, 88, 96, 104, 112
00049 };
00050
00051 double mpeg3_frame_rate_table[16] =
00052 {
00053 0.0,
00054 (double)24000.0/1001.0,
00055 (double)24.0,
00056 (double)25.0,
00057 (double)30000.0/1001.0,
00058 (double)30.0,
00059 (double)50.0,
00060 (double)60000.0/1001.0,
00061 (double)60.0,
00062
00063 1,
00064 5,
00065 10,
00066 12,
00067 15,
00068 0,
00069 0,
00070 };
00071
00072 int mpeg3video_initdecoder(mpeg3video_t *video)
00073 {
00074 int blk_cnt_tab[3] = {6, 8, 12};
00075 int cc;
00076 int i;
00077 long size[4], padding[2];
00078
00079 if(!video->mpeg2)
00080 {
00081
00082 video->prog_seq = 1;
00083 video->prog_frame = 1;
00084 video->pict_struct = FRAME_PICTURE;
00085 video->frame_pred_dct = 1;
00086 video->chroma_format = CHROMA420;
00087 video->matrix_coefficients = 5;
00088 }
00089
00090
00091 video->mb_width = (video->horizontal_size + 15) / 16;
00092 video->mb_height = (video->mpeg2 && !video->prog_seq) ?
00093 (2 * ((video->vertical_size + 31) / 32)) :
00094 ((video->vertical_size + 15) / 16);
00095 video->coded_picture_width = 16 * video->mb_width;
00096 video->coded_picture_height = 16 * video->mb_height;
00097 video->chrom_width = (video->chroma_format == CHROMA444) ?
00098 video->coded_picture_width :
00099 (video->coded_picture_width >> 1);
00100 video->chrom_height = (video->chroma_format != CHROMA420) ?
00101 video->coded_picture_height :
00102 (video->coded_picture_height >> 1);
00103 video->blk_cnt = blk_cnt_tab[video->chroma_format - 1];
00104
00105
00106 padding[0] = 16 * video->coded_picture_width;
00107 size[0] = video->coded_picture_width * video->coded_picture_height + padding[0] * 2;
00108
00109 padding[1] = 16 * video->chrom_width;
00110 size[1] = video->chrom_width * video->chrom_height + 2 * padding[1];
00111
00112 size[2] = (video->llw * video->llh);
00113 size[3] = (video->llw * video->llh) / 4;
00114
00115
00116 video->yuv_buffer[0] = (unsigned char*)calloc(1, (size[0] + padding[0]) + 2 * (size[1] + padding[1]));
00117 video->yuv_buffer[1] = (unsigned char*)calloc(1, (size[0] + padding[0]) + 2 * (size[1] + padding[1]));
00118 video->yuv_buffer[2] = (unsigned char*)calloc(1, (size[0] + padding[0]) + 2 * (size[1] + padding[1]));
00119
00120 if(video->scalable_mode == SC_SPAT)
00121 {
00122 video->yuv_buffer[3] = (unsigned char*)calloc(1, size[2] + 2 * size[3]);
00123 video->yuv_buffer[4] = (unsigned char*)calloc(1, size[2] + 2 * size[3]);
00124 }
00125
00126
00127 for(cc = 0; cc < 3; cc++)
00128 {
00129 video->llframe0[cc] = 0;
00130 video->llframe1[cc] = 0;
00131 video->newframe[cc] = 0;
00132 }
00133
00134 video->refframe[0] = video->yuv_buffer[0];
00135 video->oldrefframe[0] = video->yuv_buffer[1];
00136 video->auxframe[0] = video->yuv_buffer[2];
00137 video->refframe[2] = video->yuv_buffer[0] + size[0] + padding[0];
00138 video->oldrefframe[2] = video->yuv_buffer[1] + size[0] + padding[0];
00139 video->auxframe[2] = video->yuv_buffer[2] + size[0] + padding[0];
00140 video->refframe[1] = video->yuv_buffer[0] + size[0] + padding[0] + size[1] + padding[1];
00141 video->oldrefframe[1] = video->yuv_buffer[1] + size[0] + padding[0] + size[1] + padding[1];
00142 video->auxframe[1] = video->yuv_buffer[2] + size[0] + padding[0] + size[1] + padding[1];
00143
00144 if(video->scalable_mode == SC_SPAT)
00145 {
00146
00147 video->llframe0[0] = video->yuv_buffer[3] + padding[0] ;
00148 video->llframe1[0] = video->yuv_buffer[4] + padding[0] ;
00149 video->llframe0[2] = video->yuv_buffer[3] + padding[1] + size[2] ;
00150 video->llframe1[2] = video->yuv_buffer[4] + padding[1] + size[2] ;
00151 video->llframe0[1] = video->yuv_buffer[3] + padding[1] + size[2] + size[3];
00152 video->llframe1[1] = video->yuv_buffer[4] + padding[1] + size[2] + size[3];
00153 }
00154
00155
00156 video->cr_to_r = malloc(sizeof(long) * 256);
00157 video->cr_to_g = malloc(sizeof(long) * 256);
00158 video->cb_to_g = malloc(sizeof(long) * 256);
00159 video->cb_to_b = malloc(sizeof(long) * 256);
00160 video->cr_to_r_ptr = video->cr_to_r + 128;
00161 video->cr_to_g_ptr = video->cr_to_g + 128;
00162 video->cb_to_g_ptr = video->cb_to_g + 128;
00163 video->cb_to_b_ptr = video->cb_to_b + 128;
00164
00165 for(i = -128; i < 128; i++)
00166 {
00167 video->cr_to_r_ptr[i] = (long)( 1.371 * 65536 * i);
00168 video->cr_to_g_ptr[i] = (long)(-0.698 * 65536 * i);
00169 video->cb_to_g_ptr[i] = (long)(-0.336 * 65536 * i);
00170 video->cb_to_b_ptr[i] = (long)( 1.732 * 65536 * i);
00171 }
00172
00173 return 0;
00174 }
00175
00176 int mpeg3video_deletedecoder(mpeg3video_t *video)
00177 {
00178 int i, padding;
00179
00180 if(video->yuv_buffer[0]) free(video->yuv_buffer[0]);
00181 if(video->yuv_buffer[1]) free(video->yuv_buffer[1]);
00182 if(video->yuv_buffer[2]) free(video->yuv_buffer[2]);
00183
00184 if(video->subtitle_frame[0]) free(video->subtitle_frame[0]);
00185 if(video->subtitle_frame[1]) free(video->subtitle_frame[1]);
00186 if(video->subtitle_frame[2]) free(video->subtitle_frame[2]);
00187
00188 if(video->llframe0[0])
00189 {
00190 free(video->yuv_buffer[3]);
00191 free(video->yuv_buffer[4]);
00192 }
00193
00194 free(video->cr_to_r);
00195 free(video->cr_to_g);
00196 free(video->cb_to_g);
00197 free(video->cb_to_b);
00198 return 0;
00199 }
00200
00201 void mpeg3video_init_scantables(mpeg3video_t *video)
00202 {
00203 {
00204 video->mpeg3_zigzag_scan_table = mpeg3_zig_zag_scan_nommx;
00205 video->mpeg3_alternate_scan_table = mpeg3_alternate_scan_nommx;
00206 }
00207 }
00208
00209 mpeg3video_t* mpeg3video_allocate_struct(mpeg3_t *file, mpeg3_vtrack_t *track)
00210 {
00211 int i;
00212 mpeg3video_t *video = calloc(1, sizeof(mpeg3video_t));
00213 pthread_mutexattr_t mutex_attr;
00214
00215 video->file = file;
00216 video->track = track;
00217 video->vstream = mpeg3bits_new_stream(file, track->demuxer);
00218
00219 video->last_number = -1;
00220
00221
00222 video->framenum = -1;
00223
00224 video->byte_seek = -1;
00225 video->frame_seek = -1;
00226
00227 mpeg3video_init_scantables(video);
00228 mpeg3video_init_output();
00229
00230 pthread_mutexattr_init(&mutex_attr);
00231
00232 pthread_mutex_init(&(video->test_lock), &mutex_attr);
00233 pthread_mutex_init(&(video->slice_lock), &mutex_attr);
00234 return video;
00235 }
00236
00237 int mpeg3video_delete_struct(mpeg3video_t *video)
00238 {
00239 int i;
00240 mpeg3bits_delete_stream(video->vstream);
00241 pthread_mutex_destroy(&(video->test_lock));
00242 pthread_mutex_destroy(&(video->slice_lock));
00243 if(video->x_table)
00244 {
00245 free(video->x_table);
00246 free(video->y_table);
00247 }
00248 if(video->total_slice_decoders)
00249 {
00250 for(i = 0; i < video->total_slice_decoders; i++)
00251 mpeg3_delete_slice_decoder(&(video->slice_decoders[i]));
00252 }
00253 for(i = 0; i < video->slice_buffers_initialized; i++)
00254 mpeg3_delete_slice_buffer(&(video->slice_buffers[i]));
00255
00256
00257 free(video);
00258 return 0;
00259 }
00260
00261
00262 int mpeg3video_read_frame_backend(mpeg3video_t *video, int skip_bframes)
00263 {
00264 int result = 0;
00265 int got_top = 0, got_bottom = 0;
00266 int i = 0;
00267 mpeg3_vtrack_t *track = video->track;
00268 mpeg3_t *file = (mpeg3_t*)video->file;
00269
00270
00271
00272 do
00273 {
00274 if(mpeg3bits_eof(video->vstream)) result = 1;
00275
00276 if(!result) result = mpeg3video_get_header(video, 0);
00277
00278
00279
00280
00281
00282 video->skip_bframes = skip_bframes;
00283
00284 if(!result)
00285 result = mpeg3video_getpicture(video, video->framenum);
00286
00287
00288 if(video->pict_struct == TOP_FIELD)
00289 {
00290 got_top == 1;
00291 }
00292 else
00293 if(video->pict_struct == BOTTOM_FIELD)
00294 {
00295 got_bottom = 1;
00296 video->secondfield = 0;
00297 }
00298 else
00299 if(video->pict_struct == FRAME_PICTURE)
00300 {
00301 got_top = got_bottom = 1;
00302 }
00303
00304 i++;
00305 }while(i < 2 &&
00306 !got_bottom &&
00307 video->framenum >= 0);
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 mpeg3_decode_subtitle(video);
00318
00319
00320
00321
00322 if(!result)
00323 {
00324 video->last_number = video->framenum;
00325 video->framenum++;
00326 }
00327
00328
00329 return result;
00330 }
00331
00332 int* mpeg3video_get_scaletable(int input_w, int output_w)
00333 {
00334 int *result = malloc(sizeof(int) * output_w);
00335 float i;
00336 float scale = (float)input_w / output_w;
00337 for(i = 0; i < output_w; i++)
00338 {
00339 result[(int)i] = (int)(scale * i);
00340 }
00341 return result;
00342 }
00343
00344
00345 int mpeg3video_get_firstframe(mpeg3video_t *video)
00346 {
00347 int result = 0;
00348 video->repeat_count = video->current_repeat = 0;
00349 result = mpeg3video_read_frame_backend(video, 0);
00350 return result;
00351 }
00352
00353 static long gop_to_frame(mpeg3video_t *video, mpeg3_timecode_t *gop_timecode)
00354 {
00355 int hour, minute, second, frame, fps;
00356 long result;
00357
00358
00359 fps = (int)(video->frame_rate + 0.5);
00360
00361
00362 hour = gop_timecode->hour;
00363 minute = gop_timecode->minute;
00364 second = gop_timecode->second;
00365 frame = gop_timecode->frame;
00366
00367 result = (long)hour * 60 * 60 * fps +
00368 minute * 60 * fps +
00369 second * fps +
00370 frame;
00371
00372 return result;
00373 }
00374
00375
00376
00377
00378
00379
00380
00381
00382 mpeg3video_t* mpeg3video_new(mpeg3_t *file,
00383 mpeg3_vtrack_t *track)
00384 {
00385 mpeg3video_t *video;
00386 mpeg3_bits_t *bitstream;
00387 mpeg3_demuxer_t *demuxer;
00388 int result = 0;
00389
00390 video = mpeg3video_allocate_struct(file, track);
00391 bitstream = video->vstream;
00392 demuxer = bitstream->demuxer;
00393
00394
00395 if(file->seekable)
00396 {
00397 result = mpeg3video_get_header(video, 1);
00398
00399 if(!result)
00400 {
00401 int hour, minute, second, frame;
00402 int gop_found;
00403
00404 mpeg3video_initdecoder(video);
00405 video->decoder_initted = 1;
00406 track->width = video->horizontal_size;
00407 track->height = video->vertical_size;
00408 track->frame_rate = video->frame_rate;
00409
00410
00411 if(!track->frame_offsets)
00412 {
00413 if(file->is_video_stream)
00414 {
00415
00416 mpeg3_rewind_video(video);
00417 result = mpeg3video_next_code(bitstream,
00418 MPEG3_GOP_START_CODE);
00419 if(!result) mpeg3bits_getbits(bitstream, 32);
00420 if(!result) result = mpeg3video_getgophdr(video);
00421
00422 hour = video->gop_timecode.hour;
00423 minute = video->gop_timecode.minute;
00424 second = video->gop_timecode.second;
00425 frame = video->gop_timecode.frame;
00426
00427 video->first_frame = gop_to_frame(video, &video->gop_timecode);
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 video->frames_per_gop = 16;
00439
00440
00441 mpeg3demux_seek_byte(demuxer,
00442 mpeg3demux_movie_size(demuxer));
00443 mpeg3demux_start_reverse(demuxer);
00444 result = mpeg3video_prev_code(demuxer,
00445 MPEG3_GOP_START_CODE);
00446 mpeg3demux_start_forward(demuxer);
00447
00448
00449
00450 mpeg3bits_reset(bitstream);
00451 mpeg3bits_getbits(bitstream, 8);
00452 if(!result) result = mpeg3video_getgophdr(video);
00453
00454 hour = video->gop_timecode.hour;
00455 minute = video->gop_timecode.minute;
00456 second = video->gop_timecode.second;
00457 frame = video->gop_timecode.frame;
00458
00459 video->last_frame = gop_to_frame(video, &video->gop_timecode);
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 while(!result)
00472 {
00473 result = mpeg3video_next_code(bitstream, MPEG3_PICTURE_START_CODE);
00474 if(!result)
00475 {
00476 mpeg3bits_getbyte_noptr(bitstream);
00477 video->last_frame++;
00478 }
00479 }
00480
00481 track->total_frames = video->last_frame - video->first_frame + 1;
00482
00483 mpeg3_rewind_video(video);
00484 }
00485 else
00486
00487
00488 {
00489
00490
00491
00492
00493
00494
00495
00496 }
00497 }
00498 else
00499
00500 {
00501 track->total_frames = track->total_frame_offsets;
00502 }
00503
00504
00505
00506 video->maxframe = track->total_frames;
00507 video->repeat_count = 0;
00508 mpeg3_rewind_video(video);
00509 mpeg3video_get_firstframe(video);
00510 }
00511 else
00512 {
00513 mpeg3video_delete(video);
00514 video = 0;
00515 }
00516 }
00517
00518 return video;
00519 }
00520
00521 int mpeg3video_delete(mpeg3video_t *video)
00522 {
00523 if(video->decoder_initted)
00524 {
00525 mpeg3video_deletedecoder(video);
00526 }
00527 mpeg3video_delete_struct(video);
00528 return 0;
00529 }
00530
00531 int mpeg3video_set_cpus(mpeg3video_t *video, int cpus)
00532 {
00533 return 0;
00534 }
00535
00536 int mpeg3video_set_mmx(mpeg3video_t *video, int use_mmx)
00537 {
00538 mpeg3video_init_scantables(video);
00539 return 0;
00540 }
00541
00542
00543 int mpeg3video_read_raw(mpeg3video_t *video,
00544 unsigned char *output,
00545 long *size,
00546 long max_size)
00547 {
00548 u_int32_t code = 0;
00549 mpeg3_bits_t *vstream = video->vstream;
00550
00551 *size = 0;
00552 while(code != MPEG3_PICTURE_START_CODE &&
00553 code != MPEG3_SEQUENCE_END_CODE &&
00554 *size < max_size &&
00555 !mpeg3bits_eof(vstream))
00556 {
00557 code <<= 8;
00558 *output = mpeg3bits_getbyte_noptr(vstream);
00559 code |= *output++;
00560 (*size)++;
00561 }
00562 return mpeg3bits_eof(vstream);
00563 }
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576 int mpeg3video_read_frame(mpeg3video_t *video,
00577 unsigned char **output_rows,
00578 int in_x,
00579 int in_y,
00580 int in_w,
00581 int in_h,
00582 int out_w,
00583 int out_h,
00584 int color_model)
00585 {
00586 int result = 0;
00587 mpeg3_vtrack_t *track = video->track;
00588
00589 video->want_yvu = 0;
00590 video->output_rows = output_rows;
00591 video->color_model = color_model;
00592
00593
00594 if(video->out_w != out_w || video->out_h != out_h ||
00595 video->in_w != in_w || video->in_h != in_h ||
00596 video->in_x != in_x || video->in_y != in_y)
00597 {
00598 if(video->x_table)
00599 {
00600 free(video->x_table);
00601 free(video->y_table);
00602 video->x_table = 0;
00603 video->y_table = 0;
00604 }
00605 }
00606
00607 video->out_w = out_w;
00608 video->out_h = out_h;
00609 video->in_w = in_w;
00610 video->in_h = in_h;
00611 video->in_x = in_x;
00612 video->in_y = in_y;
00613
00614 if(!video->x_table)
00615 {
00616 video->x_table = mpeg3video_get_scaletable(video->in_w, video->out_w);
00617 video->y_table = mpeg3video_get_scaletable(video->in_h, video->out_h);
00618 }
00619
00620
00621
00622
00623 unsigned char *y, *u, *v;
00624 int frame_number = video->frame_seek >= 0 ? video->frame_seek : video->framenum;
00625 if(mpeg3_cache_get_frame(track->frame_cache,
00626 frame_number,
00627 &y,
00628 &u,
00629 &v))
00630 {
00631
00632
00633 unsigned char *temp[3];
00634 temp[0] = video->output_src[0];
00635 temp[1] = video->output_src[1];
00636 temp[2] = video->output_src[2];
00637
00638 video->output_src[0] = y;
00639 video->output_src[1] = u;
00640 video->output_src[2] = v;
00641
00642 if(video->output_src[0]) mpeg3video_present_frame(video);
00643 video->output_src[0] = temp[0];
00644 video->output_src[1] = temp[1];
00645 video->output_src[2] = temp[2];
00646
00647
00648 if(frame_number == video->framenum)
00649 video->framenum = ++frame_number;
00650 else
00651 if(frame_number == video->frame_seek)
00652 video->frame_seek = ++frame_number;
00653 }
00654 else
00655 {
00656
00657
00658 if(video->frame_seek < 0 ||
00659 video->last_number < 0 ||
00660 video->frame_seek != video->last_number)
00661 {
00662 if(!result) result = mpeg3video_seek(video);
00663 if(!result) result = mpeg3video_read_frame_backend(video, 0);
00664 }
00665 else
00666 {
00667 video->framenum = video->frame_seek + 1;
00668 video->last_number = video->frame_seek;
00669 video->frame_seek = -1;
00670 }
00671
00672 if(video->output_src[0]) mpeg3video_present_frame(video);
00673 }
00674
00675 return result;
00676 }
00677
00678 int mpeg3video_read_yuvframe(mpeg3video_t *video,
00679 char *y_output,
00680 char *u_output,
00681 char *v_output,
00682 int in_x,
00683 int in_y,
00684 int in_w,
00685 int in_h)
00686 {
00687 int result = 0;
00688 mpeg3_vtrack_t *track = video->track;
00689
00690
00691 video->want_yvu = 1;
00692 video->y_output = y_output;
00693 video->u_output = u_output;
00694 video->v_output = v_output;
00695 video->in_x = in_x;
00696 video->in_y = in_y;
00697 video->in_w = in_w;
00698 video->in_h = in_h;
00699
00700
00701
00702 unsigned char *y, *u, *v;
00703 int frame_number = video->frame_seek >= 0 ? video->frame_seek : video->framenum;
00704
00705 if(mpeg3_cache_get_frame(track->frame_cache, frame_number, &y, &u, &v))
00706 {
00707 int chroma_denominator;
00708 int size0, size1;
00709
00710
00711
00712 if(video->chroma_format == CHROMA420)
00713 chroma_denominator = 2;
00714 else
00715 chroma_denominator = 1;
00716 size0 = video->coded_picture_width * video->in_h;
00717 size1 = video->chrom_width * (int)((float)video->in_h / chroma_denominator + 0.5);
00718
00719
00720
00721 unsigned char *temp[3];
00722 temp[0] = video->output_src[0];
00723 temp[1] = video->output_src[1];
00724 temp[2] = video->output_src[2];
00725
00726 video->output_src[0] = y;
00727 video->output_src[1] = u;
00728 video->output_src[2] = v;
00729
00730 if(video->output_src[0]) mpeg3video_present_frame(video);
00731 video->output_src[0] = temp[0];
00732 video->output_src[1] = temp[1];
00733 video->output_src[2] = temp[2];
00734
00735
00736 if(frame_number == video->framenum)
00737 video->framenum = ++frame_number;
00738 else
00739 if(frame_number == video->frame_seek)
00740 video->frame_seek = ++frame_number;
00741 }
00742 else
00743 {
00744 if(!result) result = mpeg3video_seek(video);
00745 if(!result) result = mpeg3video_read_frame_backend(video, 0);
00746 if(video->output_src[0]) mpeg3video_present_frame(video);
00747 }
00748
00749
00750
00751
00752 video->want_yvu = 0;
00753 video->byte_seek = -1;
00754 return result;
00755 }
00756
00757 int mpeg3video_read_yuvframe_ptr(mpeg3video_t *video,
00758 char **y_output,
00759 char **u_output,
00760 char **v_output)
00761 {
00762 int result = 0;
00763 mpeg3_vtrack_t *track = video->track;
00764
00765 video->want_yvu = 1;
00766
00767 *y_output = *u_output = *v_output = 0;
00768
00769 unsigned char *y, *u, *v;
00770 int frame_number = video->frame_seek >= 0 ? video->frame_seek : video->framenum;
00771 if(mpeg3_cache_get_frame(track->frame_cache, frame_number, &y, &u, &v))
00772 {
00773 *y_output = (char*)y;
00774 *u_output = (char*)u;
00775 *v_output = (char*)v;
00776
00777
00778 if(frame_number == video->framenum)
00779 video->framenum = ++frame_number;
00780 else
00781 if(frame_number == video->frame_seek)
00782 video->frame_seek = ++frame_number;
00783 }
00784 else
00785
00786 if(video->frame_seek < 0 ||
00787 video->last_number < 0 ||
00788 video->frame_seek != video->last_number)
00789 {
00790 if(!result) result = mpeg3video_seek(video);
00791 if(!result) result = mpeg3video_read_frame_backend(video, 0);
00792
00793 if(video->output_src[0])
00794 {
00795 *y_output = (char*)video->output_src[0];
00796 *u_output = (char*)video->output_src[1];
00797 *v_output = (char*)video->output_src[2];
00798 }
00799 }
00800 else
00801 {
00802 video->framenum = video->frame_seek + 1;
00803 video->last_number = video->frame_seek;
00804 video->frame_seek = -1;
00805
00806 if(video->output_src[0])
00807 {
00808 *y_output = (char*)video->output_src[0];
00809 *u_output = (char*)video->output_src[1];
00810 *v_output = (char*)video->output_src[2];
00811 }
00812 }
00813
00814
00815 video->want_yvu = 0;
00816
00817 video->byte_seek = -1;
00818
00819
00820 return result;
00821 }
00822
00823 int mpeg3video_colormodel(mpeg3video_t *video)
00824 {
00825 switch(video->chroma_format)
00826 {
00827 case CHROMA422:
00828 return MPEG3_YUV422P;
00829 break;
00830
00831 case CHROMA420:
00832 return MPEG3_YUV420P;
00833 break;
00834 }
00835
00836 return MPEG3_YUV420P;
00837 }
00838
00839 void mpeg3video_dump(mpeg3video_t *video)
00840 {
00841 printf("mpeg3video_dump 1\n");
00842 printf(" *** sequence extension 1\n");
00843 printf("prog_seq=%d\n", video->prog_seq);
00844 printf(" *** picture header 1\n");
00845 printf("pict_type=%d field_sequence=%d\n", video->pict_type, video->field_sequence);
00846 printf(" *** picture coding extension 1\n");
00847 printf("field_sequence=%d repeatfirst=%d prog_frame=%d pict_struct=%d\n",
00848 video->field_sequence,
00849 video->repeatfirst,
00850 video->prog_frame,
00851 video->pict_struct);
00852 }
00853
00854
00855
00856
00857
00858