comparison mpegvideo.c @ 1586:3d1d0490e5a6 libavcodec

pts fix and related fixes
author michael
date Thu, 30 Oct 2003 16:58:49 +0000
parents 628bf341e099
children 4c9165372ab3
comparison
equal deleted inserted replaced
1585:6b224ca24033 1586:3d1d0490e5a6
1012 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */ 1012 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1013 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */ 1013 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1014 } 1014 }
1015 } 1015 }
1016 1016
1017 static int find_unused_picture(MpegEncContext *s, int shared){ 1017 int ff_find_unused_picture(MpegEncContext *s, int shared){
1018 int i; 1018 int i;
1019 1019
1020 if(shared){ 1020 if(shared){
1021 for(i=0; i<MAX_PICTURE_COUNT; i++){ 1021 for(i=0; i<MAX_PICTURE_COUNT; i++){
1022 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) break; 1022 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1023 } 1023 }
1024 }else{ 1024 }else{
1025 for(i=0; i<MAX_PICTURE_COUNT; i++){ 1025 for(i=0; i<MAX_PICTURE_COUNT; i++){
1026 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) break; //FIXME 1026 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1027 } 1027 }
1028 for(i=0; i<MAX_PICTURE_COUNT; i++){ 1028 for(i=0; i<MAX_PICTURE_COUNT; i++){
1029 if(s->picture[i].data[0]==NULL) break; 1029 if(s->picture[i].data[0]==NULL) return i;
1030 } 1030 }
1031 } 1031 }
1032 1032
1033 assert(i<MAX_PICTURE_COUNT); 1033 assert(0);
1034 return i; 1034 return -1;
1035 } 1035 }
1036 1036
1037 /* generic function for encode/decode called before a frame is coded/decoded */ 1037 /**
1038 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1039 */
1038 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) 1040 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1039 { 1041 {
1040 int i; 1042 int i;
1041 AVFrame *pic; 1043 AVFrame *pic;
1042
1043 s->mb_skiped = 0; 1044 s->mb_skiped = 0;
1044 1045
1045 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3); 1046 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1046 1047
1047 /* mark&release old frames */ 1048 /* mark&release old frames */
1066 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ 1067 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1067 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]); 1068 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1068 } 1069 }
1069 } 1070 }
1070 1071
1071 i= find_unused_picture(s, 0); 1072 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1072 1073 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1073 pic= (AVFrame*)&s->picture[i]; 1074 else{
1075 i= ff_find_unused_picture(s, 0);
1076 pic= (AVFrame*)&s->picture[i];
1077 }
1078
1074 pic->reference= s->pict_type != B_TYPE ? 3 : 0; 1079 pic->reference= s->pict_type != B_TYPE ? 3 : 0;
1075 1080
1076 if(s->current_picture_ptr) 1081 if(s->current_picture_ptr) //FIXME broken, we need a coded_picture_number in MpegEncContext
1077 pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1; 1082 pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1;
1078 1083
1079 if( alloc_picture(s, (Picture*)pic, 0) < 0) 1084 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1080 return -1; 1085 return -1;
1081 1086
1082 s->current_picture_ptr= &s->picture[i]; 1087 s->current_picture_ptr= (Picture*)pic;
1083 } 1088 }
1084 1089
1085 s->current_picture_ptr->pict_type= s->pict_type; 1090 s->current_picture_ptr->pict_type= s->pict_type;
1086 // if(s->flags && CODEC_FLAG_QSCALE) 1091 // if(s->flags && CODEC_FLAG_QSCALE)
1087 // s->current_picture_ptr->quality= s->new_picture_ptr->quality; 1092 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1423 if(pic_arg->linesize[2] != s->uvlinesize) direct=0; 1428 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1424 1429
1425 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize); 1430 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1426 1431
1427 if(direct){ 1432 if(direct){
1428 i= find_unused_picture(s, 1); 1433 i= ff_find_unused_picture(s, 1);
1429 1434
1430 pic= (AVFrame*)&s->picture[i]; 1435 pic= (AVFrame*)&s->picture[i];
1431 pic->reference= 3; 1436 pic->reference= 3;
1432 1437
1433 for(i=0; i<4; i++){ 1438 for(i=0; i<4; i++){
1435 pic->linesize[i]= pic_arg->linesize[i]; 1440 pic->linesize[i]= pic_arg->linesize[i];
1436 } 1441 }
1437 alloc_picture(s, (Picture*)pic, 1); 1442 alloc_picture(s, (Picture*)pic, 1);
1438 }else{ 1443 }else{
1439 int offset= 16; 1444 int offset= 16;
1440 i= find_unused_picture(s, 0); 1445 i= ff_find_unused_picture(s, 0);
1441 1446
1442 pic= (AVFrame*)&s->picture[i]; 1447 pic= (AVFrame*)&s->picture[i];
1443 pic->reference= 3; 1448 pic->reference= 3;
1444 1449
1445 alloc_picture(s, (Picture*)pic, 0); 1450 alloc_picture(s, (Picture*)pic, 0);
1585 copy_picture(&s->new_picture, s->reordered_input_picture[0]); 1590 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
1586 1591
1587 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){ 1592 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
1588 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable 1593 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
1589 1594
1590 int i= find_unused_picture(s, 0); 1595 int i= ff_find_unused_picture(s, 0);
1591 Picture *pic= &s->picture[i]; 1596 Picture *pic= &s->picture[i];
1592 1597
1593 /* mark us unused / free shared pic */ 1598 /* mark us unused / free shared pic */
1594 for(i=0; i<4; i++) 1599 for(i=0; i<4; i++)
1595 s->reordered_input_picture[0]->data[i]= NULL; 1600 s->reordered_input_picture[0]->data[i]= NULL;